5eb20f81d9 Consistently use ParseHashV to validate hash inputs in rpc (Ben Woosley)
Pull request description:
ParseHashV validates the length and encoding of the string and throws
an informative RPC error on failure, which is as good or better than
these alternative calls.
Note I switched ParseHashV to check string length first, because
IsHex tests that the length is even, and an error like:
"must be of length 64 (not 63, for X)" is much more informative than
"must be hexadecimal string (not X)" in that case.
Split from #13420
Tree-SHA512: f0786b41c0d7793ff76e4b2bb35547873070bbf7561d510029e8edb93f59176277efcd4d183b3185532ea69fc0bbbf3dbe9e19362e8017007ae9d51266cd78ae
assert_raises_rpc_error(-1,"txid must be hexadecimal string",self.nodes[0].prioritisetransaction,txid='foo',fee_delta=0)
assert_raises_rpc_error(-8,"txid must be of length 64 (not 3, for 'foo')",self.nodes[0].prioritisetransaction,txid='foo',fee_delta=0)
assert_raises_rpc_error(-8,"txid must be hexadecimal string (not 'Zd1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000')",self.nodes[0].prioritisetransaction,txid='Zd1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000',fee_delta=0)
@ -125,7 +125,9 @@ class BlockchainTest(BitcoinTestFramework):
# Test `getchaintxstats` invalid `blockhash`
assert_raises_rpc_error(-1,"JSON value is not a string as expected",self.nodes[0].getchaintxstats,blockhash=0)
assert_raises_rpc_error(-5,"Block not found",self.nodes[0].getchaintxstats,blockhash='0')
assert_raises_rpc_error(-8,"blockhash must be of length 64 (not 1, for '0')",self.nodes[0].getchaintxstats,blockhash='0')
assert_raises_rpc_error(-8,"blockhash must be hexadecimal string (not 'ZZZ0000000000000000000000000000000000000000000000000000000000000')",self.nodes[0].getchaintxstats,blockhash='ZZZ0000000000000000000000000000000000000000000000000000000000000')
assert_raises_rpc_error(-5,"Block not found",self.nodes[0].getchaintxstats,blockhash='0000000000000000000000000000000000000000000000000000000000000000')
blockhash=self.nodes[0].getblockhash(200)
self.nodes[0].invalidateblock(blockhash)
assert_raises_rpc_error(-8,"Block is not in main chain",self.nodes[0].getchaintxstats,blockhash=blockhash)
@ -203,7 +205,9 @@ class BlockchainTest(BitcoinTestFramework):
def_test_getblockheader(self):
node=self.nodes[0]
assert_raises_rpc_error(-5,"Block not found",node.getblockheader,"nonsense")
assert_raises_rpc_error(-8,"hash must be of length 64 (not 8, for 'nonsense')",node.getblockheader,"nonsense")
assert_raises_rpc_error(-8,"hash must be hexadecimal string (not 'ZZZ7bb8b1697ea987f3b223ba7819250cae33efacb068d23dc24859824a77844')",node.getblockheader,"ZZZ7bb8b1697ea987f3b223ba7819250cae33efacb068d23dc24859824a77844")
assert_raises_rpc_error(-5,"Block not found",node.getblockheader,"0cf7bb8b1697ea987f3b223ba7819250cae33efacb068d23dc24859824a77844")
assert_raises_rpc_error(-3,"Expected type array",self.nodes[0].createrawtransaction,'foo',{})
assert_raises_rpc_error(-1,"JSON value is not an object as expected",self.nodes[0].createrawtransaction,['foo'],{})
assert_raises_rpc_error(-8,"txid must be hexadecimal string",self.nodes[0].createrawtransaction,[{}],{})
assert_raises_rpc_error(-8,"txid must be hexadecimal string",self.nodes[0].createrawtransaction,[{'txid':'foo'}],{})
assert_raises_rpc_error(-1,"JSON value is not a string as expected",self.nodes[0].createrawtransaction,[{}],{})
assert_raises_rpc_error(-8,"txid must be of length 64 (not 3, for 'foo')",self.nodes[0].createrawtransaction,[{'txid':'foo'}],{})
assert_raises_rpc_error(-8,"txid must be hexadecimal string (not 'ZZZ7bb8b1697ea987f3b223ba7819250cae33efacb068d23dc24859824a77844')",self.nodes[0].createrawtransaction,[{'txid':'ZZZ7bb8b1697ea987f3b223ba7819250cae33efacb068d23dc24859824a77844'}],{})
assert_raises_rpc_error(-8,"Invalid parameter, vout must be positive",self.nodes[0].createrawtransaction,[{'txid':txid,'vout':-1}],{})
@ -224,9 +225,10 @@ class RawTransactionsTest(BitcoinTestFramework):
# We should not get the tx if we provide an unrelated block
assert_raises_rpc_error(-5,"No such transaction found",self.nodes[0].getrawtransaction,tx,True,block2)
# An invalid block hash should raise the correct errors
assert_raises_rpc_error(-8,"parameter 3 must be hexadecimal",self.nodes[0].getrawtransaction,tx,True,True)
assert_raises_rpc_error(-8,"parameter 3 must be hexadecimal",self.nodes[0].getrawtransaction,tx,True,"foobar")
assert_raises_rpc_error(-8,"parameter 3 must be of length 64",self.nodes[0].getrawtransaction,tx,True,"abcd1234")
assert_raises_rpc_error(-1,"JSON value is not a string as expected",self.nodes[0].getrawtransaction,tx,True,True)
assert_raises_rpc_error(-8,"parameter 3 must be of length 64 (not 6, for 'foobar')",self.nodes[0].getrawtransaction,tx,True,"foobar")
assert_raises_rpc_error(-8,"parameter 3 must be of length 64 (not 8, for 'abcd1234')",self.nodes[0].getrawtransaction,tx,True,"abcd1234")
assert_raises_rpc_error(-8,"parameter 3 must be hexadecimal string (not 'ZZZ0000000000000000000000000000000000000000000000000000000000000')",self.nodes[0].getrawtransaction,tx,True,"ZZZ0000000000000000000000000000000000000000000000000000000000000")
assert_raises_rpc_error(-5,"Block hash not found",self.nodes[0].getrawtransaction,tx,True,"0000000000000000000000000000000000000000000000000000000000000000")
assert_raises_rpc_error(-8,"txid must be of length 64 (not 32, for '00000000000000000000000000000000')",self.nodes[2].gettxoutproof,["00000000000000000000000000000000"],blockhash)
assert_raises_rpc_error(-8,"txid must be hexadecimal string (not 'ZZZ0000000000000000000000000000000000000000000000000000000000000')",self.nodes[2].gettxoutproof,["ZZZ0000000000000000000000000000000000000000000000000000000000000"],blockhash)
# Invalid blockhashes
assert_raises_rpc_error(-8,"blockhash must be of length 64 (not 32, for '00000000000000000000000000000000')",self.nodes[2].gettxoutproof,[txid_spent],"00000000000000000000000000000000")
assert_raises_rpc_error(-8,"blockhash must be hexadecimal string (not 'ZZZ0000000000000000000000000000000000000000000000000000000000000')",self.nodes[2].gettxoutproof,[txid_spent],"ZZZ0000000000000000000000000000000000000000000000000000000000000")
# We can't find the block from a fully-spent tx
assert_raises_rpc_error(-5,"Transaction not yet in block",self.nodes[2].gettxoutproof,[txid_spent])
# We can't get the proof if we specify a non-existent block
assert_raises_rpc_error(-5,"Block not found",self.nodes[2].gettxoutproof,[txid_spent],"00000000000000000000000000000000")
assert_raises_rpc_error(-5,"Block not found",self.nodes[2].gettxoutproof,[txid_spent],"0000000000000000000000000000000000000000000000000000000000000000")
# We can get the proof if the transaction is unspent
assert_raises_rpc_error(-5,"Block not found",self.nodes[0].listsinceblock,
assert_raises_rpc_error(-8,"blockhash must be of length 64 (not 11, for 'invalid-hex')",self.nodes[0].listsinceblock,
"invalid-hex")
assert_raises_rpc_error(-8,"blockhash must be hexadecimal string (not 'Z000000000000000000000000000000000000000000000000000000000000000')",self.nodes[0].listsinceblock,