fromioimportBytesIOfromunittestimportTestCaseimportjsonimportrequestsfromeccimportPrivateKeyfromhelperimport(encode_varint,hash256,int_to_little_ian,little_ian_to_int,read_varint,SIGHASH_ALL,)fromscriptimportp2pkh_script,ScriptclassTxFetcher:cache={}@classmethoddefget_url(cls,testnet=False):iftestnet:return''else:return''@classmethoddeffetch(cls,tx_id,testnet=False,fresh=False):iffreshor(tx_):url='{}/tx/{}/hex'.format(_url(testnet),tx_id)response=(url)try:raw=(())exceptValueError:raiseValueError('unexpectedresponse:{}'.format())tx=(BytesIO(raw),testnet=testnet)tag::source1[]classTx:command=b'tx'def__init__(self,version,tx_ins,tx_outs,locktime,testnet=False,segwit=False):=_ins=tx__outs=tx_===segwitself._hash_prevouts=Noneself._hash_sequence=Noneself._hash_outputs=Nonetag::source5[]defhash(self):'''Binaryhashofthelegacyserialization'''returnhash256(_legacy())[::-1]tag::source2[]@classmethoddefparse(cls,s,testnet=False):(4)2parse_method=_segwitelse:parse_method=_(-5,1)4num_inputs=read_varint(s)inputs=[]for_inrange(num_inputs):((s))num_outputs=read_varint(s)outputs=[]for_inrange(num_outputs):((s))locktime=little_ian_to_int((4))returncls(version,inputs,outputs,locktime,testnet=testnet,segwit=False)tag::source3[]@classmethoddefparse_segwit(cls,s,testnet=False):version=little_ian_to_int((4))marker=(2)ifmarker!=b'\x00\x01':2num_items=read_varint(s)items=[]for_inrange(num_items):item_len=read_varint(s)ifitem_len==0:(0)else:((item_len))tx_=itemslocktime=little_ian_to_int((4))returncls(version,inputs,outputs,locktime,testnet=testnet,segwit=True)tag::source4[]defserialize(self)::_segwit()else:_legacy()defserialize_legacy(self):2result+=encode_varint(len(_ins))fortx__ins:result+=tx_()result+=encode_varint(len(_outs))fortx__outs:result+=tx_()fortx__ins:::source4[]deffee(self):'''Returnsthefeeofthistransactioninsatoshi'''()tosumuptheinputamountsfortx__ins:input_sum+=tx_()feeisinputsum-outputsumreturninput_sum-output_sumdefsig_hash(self,input_index,redeem_script=None):'''Returnstheintegerrepresentationofthehashthatneedstogetsignedforindexinput_index'''useint_to_little_ianin4bytess=int_to_little_ian(,4)loopthrougheachinputusingenumerate,sowehavetheinputindexfori,tx_ininenumerate(_ins):iftheRedeemScriptwaspassedin,that'stheScriptSigifredeem_script:script_sig=redeem_scriptOtherwise,theScriptSigisemptyelse:script_sig=Noneaddhowmanyoutputsthereareusingencode_varints+=encode_varint(len(_outs))addthelocktimeusingint_to_little_ianin4bytess+=int_to_little_ian(,4)hash256theserializationh256=hash256(s)thisshouldcalculateself._hash_prevoutsreturnself._hash_sequencedefhash_outputs(self):ifself._hash_outputsisNone:all_outputs=b''fortx__outs:all_outputs+=tx_()self._hash_outputs=hash256(all_outputs)returnself._hash_outputsdefsig_hash_bip143(self,input_index,redeem_script=None,witness_script=None):'''Returnstheintegerrepresentationofthehashthatneedstogetsignedforindexinput_index'''tx_in=_ins[input_index]gettherelevantinputtx_in=_ins[input_index]checktoseeiftheScriptPubkeyisap2shifscript__p2sh_script_pubkey():parsetheRedeemScriptraw_redeem=int_to_little_ian(len(cmd),1)+cmdredeem_script=(BytesIO(raw_redeem))ScriptPubkeymightbeap2wpkhorp2wshifscript__p2wpkh_script_pubkey():z=_hash_bip143(input_index)witness=tx___p2wsh_script_pubkey():cmd=tx_[-1]raw_witness=encode_varint(len(cmd))+cmdwitness_script=(BytesIO(raw_witness))z=_hash_bip143(input_index,witness_script=witness_script)witness=tx_:z=_hash(input_index)witness=(z,witness)defverify(self):'''Verifythistransaction'''checkthateachinputhasavalidScriptSigforiinrange(len(_ins)):_input(i):returnFalsereturnTruedefsign_input(self,input_index,private_key):'''Signstheinputusingtheprivatekey'''getdersignatureofzfromprivatekeyder=private_(z).der()calculatethesecsec=private_()changeinput'sscript__ins[input_index].script_sig=script_sigcheckthatthereisexactly1inputiflen(_ins)!=1:returnFalsecheckthatfirstinputprev_txisb'\x00'*32bytesiffirst__tx!=b'\x00'*32:returnFalseifthisisNOTacoinbasetransaction,_coinbase():returnNoneconvertthecmdfromlittleiantointreturnlittle_ian_to_int(first_cmd)classTxIn:def__init__(self,prev_tx,prev_index,script_sig=None,sequence=0xffffffff):_tx=prev__index=prev_indexifscript_sigisNone:_sig=Script()else:_sig=script_=sequencedef__repr__(self):return'{}:{}'.format(_(),_index,)@classmethoddefparse(cls,s):'''Takesabytestreamandparsesthetx_inputatthestartreturnaTxInobject'''prev_indexisanintegerin4bytes,littleianprev_index=little_ian_to_int((4))sequenceisanintegerin4bytes,little-iansequence=little_ian_to_int((4))serializeprev_tx,littleianresult=_tx[::-1]serializethescript_sigresult+=_()_txtogetthetransactiontx=_tx(testnet=testnet)_outs[_index].amountdefscript_pubkey(self,testnet=False):'''GettheScriptPubKeybylookingupthetxhashReturnsaScriptobject'''_indexamountisanintegerin8bytes,littleianamount=little_ian_to_int((8))returnaninstanceoftheclass(see__init__forargs)returncls(amount,script_pubkey)defserialize(self):'''Returnsthebyteserializationofthetransactionoutput'''serializethescript_pubkeyresult+=_()returnresultclassTxTest(TestCase):cache_file='../'@classmethoddefsetUpClass(cls):_cache(_file)deftest_parse_version(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)(,1)deftest_parse_inputs(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)(len(_ins),1)want=('d1c789a9c60383bf715f3f6ad9d14b91fe55f3deb369fe5d9280cb1a01793f81')(_ins[0].prev_tx,want)(_ins[0].prev_index,0)want=('6b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278a')(_ins[0].script_(),want)(_ins[0].sequence,0xfffffffe)deftest_parse_outputs(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)(len(_outs),2)want=32454049(_outs[0].amount,want)want=('1976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac')(_outs[0].script_(),want)want=10011545(_outs[1].amount,want)want=('1976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac')(_outs[1].script_(),want)deftest_parse_locktime(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)(,410393)deftest_serialize(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)((),raw_tx)deftest_input_value(self):tx_hash='d1c789a9c60383bf715f3f6ad9d14b91fe55f3deb369fe5d9280cb1a01793f81'index=0want=42505594tx_in=TxIn((tx_hash),index)(tx_(),want)deftest_input_pubkey(self):tx_hash='d1c789a9c60383bf715f3f6ad9d14b91fe55f3deb369fe5d9280cb1a01793f81'index=0tx_in=TxIn((tx_hash),index)want=('1976a914a802fc56c704ce87c42d7c92eb75e7896bdc41ae88ac')(tx__pubkey().serialize(),want)deftest_fee(self):raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)((),40000)raw_tx=('010000000456919960ac691763688d3d3bcea9ad6ecaf875df5339e148a1fc61c6ed7a069e010000006a47304402204585bcdef85e6b1c6af5c2669d4830ff86e42dd205c0e089bc2a821657e951c002201024a10366077f87d6bce1f7100ad8cfa8a064b39d4e8fe4ea13a7b71aa8180f012102f0da57e85eec2934a82a585ea337ce2f4998b50ae699dd79f5880e253dafafb7feffffffeb8f51f4038dc17e6313cf831d4f02281c2a468bde0fafd37f1bf882729e7fd3000000006a47304402207899531a52d59a6de200179928ca900254a36b8dff8bb75f5f5d71b1cdc26125022008b422690b8461cb52c3cc30330b23d574351872b7c361e9aae3649071c1a7160121035d5c93d9ac96881f19ba1f686f15f009ded7c62efe85a872e6a19b43c15a2937feffffff567bf40595119d1bb8a3037c356efd56170b64cbcc160fb028fa10704b45d775000000006a47304402204c7c7818424c7f7911da6cddc59655a70af1cb5eaf17c69dadbfc74ffa0b662f02207599e08bc8023693ad4e9527dc42c34210f7a7d1d1ddfc8492b654a11e7620a0012102158b46fbdff65d0172b7989aec8850aa0dae49abfb84c81ae6e5b251a58ace5cfeffffffd63a5e6c16e620f86f375925b21cabaf736c779f88fd04dcad51d26690f7f345010000006a47304402200633ea0d3314bea0d95b3cd8dadb2ef79ea8331ffe1e61f762c0f6daea0fabde022029f23b3e9c30f080446150b23852028751635dcee2be669c2a1686a4b5edf304012103ffd6f4a67e94aba353a00882e563ff2722eb4cff0ad6006e86ee20dfe7520d55feffffff0251430f00000000001976a914ab0c0b2e98b1ab6dbf67d4750b0a56244948a87988ac005a6202000000001976a9143c82d7df364eb6c75be8c80df2b3eda8db57397088ac46430600')stream=BytesIO(raw_tx)tx=(stream)((),140500)deftest_sig_hash(self):tx=('452c629d67e41baec3ac6f04fe744b4b9617f8f859c63b3002f8684e7a4fee03')want=int('27e0c5994dec7824e56dec6b2fcb342eb7cdb0d0957c2fce9882f715e85d81a6',16)(_hash(0),want)deftest_verify_p2pkh(self):tx=('452c629d67e41baec3ac6f04fe744b4b9617f8f859c63b3002f8684e7a4fee03')(())tx=('5418099cc755cb9dd3ebc6cf1a7888ad53a1a3beb5a025bce89eb1bf7f1650a2',testnet=True)(())deftest_verify_p2sh(self):tx=('46df1a9484d0a81d03ce0ee543ab6e1a23ed06175c104a178268fad381216c2b')(())deftest_verify_p2wpkh(self):tx=('d869f854e1f8788bcff294cc83b280942a8c728de71eb709a2c29d10bfe21b7c',testnet=True)(())deftest_verify_p2sh_p2wpkh(self):tx=('c586389e5e4b3acb9d6c8be1c19ae8ab2795397633176f5a6442a261bbdefc3a')(())deftest_verify_p2wsh(self):tx=('78457666f82c28aa37b74b506745a7c7684dc7842a52a457b09f09446721e11c',testnet=True)(())deftest_verify_p2sh_p2wsh(self):tx=('954f43dbb30ad8024981c07d1f5eb6c9fd461e2cf1760dd1283f052af746fc88',testnet=True)(())deftest_sign_input(self):private_key=PrivateKey(secret=8675309)stream=BytesIO(('010000000199a24308080ab26e6fb65c4eccfadf76749bb5bfa8cb08f291320b3c21e56f0d0d00000000ffffffff02408af701000000001976a914d52ad7ca9b3d096a38e752c2018e6fbc40cdf26f88ac8096901976a914507b27411ccf7f16f10297de6cef3f291623eddf88ac00000000'))tx_obj=(stream,testnet=True)(tx__input(0,private_key))want='010000000199a24308080ab26e6fb65c4eccfadf76749bb5bfa8cb08f291320b3c21e56f0d0d0000006b4830450221008ed46aa2cf12d6d81065bfabe903670165b538f65ee9a3385e6327d80c66d3b502203124f804410527497329ec4715e18558082d489b218677bd029e7fa306a72236012103935581e52c354cd2f484fe8ed83af7a3097005b2f9c60bff71d35bd795f54b67ffffffff02408af701000000001976a914d52ad7ca9b3d096a38e752c2018e6fbc40cdf26f88ac8096901976a914507b27411ccf7f16f10297de6cef3f291623eddf88ac00000000'(tx_().hex(),want)deftest_is_coinbase(self):raw_tx=('01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5e03d71b07254d696e656420627920416e74506f6f6c20626a31312f4542312f4144362f43205914293101fabe6d6d678e2c8c34afc36896e7d9402824ed38e856676ee94bfdb0c6c4bcd8b2e5666a000000c7270000a5e00e00ffffffff01faf20b5976a914338c84849423992471bffb1a54a8d9b1d69dc28a88ac00000000')stream=BytesIO(raw_tx)tx=(stream)(_coinbase())deftest_coinbase_height(self):raw_tx=('01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5e03d71b07254d696e656420627920416e74506f6f6c20626a31312f4542312f4144362f43205914293101fabe6d6d678e2c8c34afc36896e7d9402824ed38e856676ee94bfdb0c6c4bcd8b2e5666a000000c7270000a5e00e00ffffffff01faf20b5976a914338c84849423992471bffb1a54a8d9b1d69dc28a88ac00000000')stream=BytesIO(raw_tx)tx=(stream)(_height(),465879)raw_tx=('0100000001813f79011acb80925dfe69b3def355fe914bd1d96a3f5f71bf8303c6a989c7d1000000006b483045022100ed81ff192e75a3fd2304004dcadb746fa5e24c5031ccfcf21320b0277457c98f02207a986d955c6e0cb35d446a89d3f56100f4d7f67801c31967743a9c8e10615bed01210349fc4e631e3624a545de3f89f5d8684c7b8138bd94bdd531d2e213bf016b278afeffffff02a135ef01000000001976a914bc3b654dca7e56b04dca18f2566cdaf02e8d9ada88ac99c3901976a9141c4bc762dd5423e332166702cb75f40df79fea1288ac19430600')stream=BytesIO(raw_tx)tx=(stream)(_height())
正文
十三、隔离见证
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系我们会予以删除相关文章,保证您的权利。