vbuterin / pybitcointools

SImple, common-sense Bitcoin-themed Python ECC library
1.28k stars 857 forks source link

Unicode errors under Python 2.7 #83

Closed wizardofozzie closed 8 years ago

wizardofozzie commented 9 years ago

UNICODE objects under Python 2.7 causing issues.

deserialize_script on unicode dictionary objects (from bitcoin-rpc) returns no error but completely corrupted data deserialize on a unicode raw hex tx throws an error in py2specials.decode

Both can be solved by ensuring unicode objects are non-unicode strings ie by using str(unicode_basestring)


lu = rpc.listunspent()

>>>lu[-2]

{u'account': u'',
 u'address': u'2NCgTCaiUHSVKZ6Wwvx74D1Me9gLN1Gw8Rr',
 u'amount': Decimal('0.00940000'),
 u'confirmations': 14839,
 u'redeemScript': u'522103d3ff0a3067aece5817d1c017d8f119422b208d30764fd595747b3a1e7b6cae95210268a35242e5f131f031a25bb0d5
7141c7737b1668ed702bc8c6ec65205d85e8f82102d7c0f0b9eafe5af2c6d68411fd16a9b596a607ea4ae670bad3ffabfd0ee6bd0353ae',
 u'scriptPubKey': u'a914d52fd15aab4e472f198f64b001a8fafa57ca264587',
 u'spendable': True,
 u'txid': u'c1cfe29c3e1ae6fbf2cb7631cb4c9b2e12f31c8038877ca0522ddae67757e3db',
 u'vout': 0}

 redeemScript = u'522103d3ff0a3067aece5817d1c017d8f119422b208d30764fd595747b3a1e7b6cae95210268a35242e5f131f031a25bb0d57141c7737b1668ed702bc8c6ec65205d85e8f82102d7c0f0b9eafe5af2c6d68411fd16a9b596a607ea4ae670bad3ffabfd0ee6bd0353ae'

deserialize_script(lu[-2]['redeemScript'])      # unicode object

[u'22103d3ff0a3067aece5817d1c017d8f119422b208d30764fd595',
 u'47b3a1e7b6cae95210268a35242e5f131f031a25bb0d57141c7737b',
 u'668ed702bc8c6ec65205d85e8f82102d7c0f0b9eafe5af2c6',
 100,
 u'8411fd16a9b596a607ea4ae670bad3ffabfd0ee6bd0353ae']

deserialize_script(str(lu[-2]['redeemScript']))

>>> [2,
 '03d3ff0a3067aece5817d1c017d8f119422b208d30764fd595747b3a1e7b6cae95',
 '0268a35242e5f131f031a25bb0d57141c7737b1668ed702bc8c6ec65205d85e8f8',
 '02d7c0f0b9eafe5af2c6d68411fd16a9b596a607ea4ae670bad3ffabfd0ee6bd03',
 3,
 174]

 testnet_raw_tx = u"01000000019606a46d9a2539051dac55696daea42f61af02a03f287a618d8effb00ec0eff7000000008b4830450221009f2d20c46be10de310b57f8f8583d349d07ae9879344372729749c95715dab4002204418e87634aa723432e83d216d7e50a37140e070e1da72a23663063f1e1298610141045dfb08a474f86ebfb7d2f1786f4d9a9347ac46346229373b892883467c6b624b53a106d9628896fbd5343e0efe3528d934701e1d87caa57475320ff1c6aa4c10ffffffff02802b530b000000001976a91423e01dab3bfd754dd92aa86715322db3e050733b88ac0000000000000000fd37036a4d3303476f206f6e20616e64207772696e67206d79206e65636b0a4c696b65207768656e2061207261672067657473207765740a41206c6974746c65206469736369706c696e650a466f72206d79207065742067656e6975730a4d792068656164206973206c696b65206c6574747563650a476f206f6e2064696720796f7572207468756d627320696e0a492063616e6e6f742073746f7020676976696e670a49276d207468697274792d736f6d657468696e670a53656e7365206f662073656375726974790a4c696b6520706f636b657473206a696e676c696e670a4d69646c696665206372697369730a5375636b20696e67656e756974790a446f776e207468726f756768207468652066616d696c7920747265650a596f7527726520706572666563742c207965732c206974277320747275650a42757420776974686f7574206d6520796f75277265206f6e6c7920796f750a596f7572206d656e737472756174696e672068656172740a49742061696e277420626c656564696e2720656e6f75676820666f722074776f0a497427732061206d69646c696665206372697369732e2e2e0a5768617420616e20696e6865726974616e63650a5468652073616c7420616e6420746865206b6c65656e65780a4d6f726269642073656c6620617474656e74696f6e0a42656e64696e67206d792070696e6b79206261636b0a41206c6974746c65206469736369706c696e650a4120646f6e6f722062792068616269740a41206c6974746c65206469736369706c696e650a52656e7420616e206f70696e696f6e0a53656e7365206f662073656375726974790a486f6c64696e6720626c756e7420696e737472756d656e740a49276d20612070657266656374696f6e6973740a416e642070657266656374206973206120736b696e6e6564206b6e65650a596f7527726520706572666563742c207965732c206974277320747275650a42757420776974686f7574206d6520796f75277265206f6e6c7920796f750a596f7572206d656e737472756174696e672068656172740a49742061696e277420626c656564696e2720656e6f75676820666f722074776f0a497427732061206d69646c696665206372697369732e2e2e00000000"

 deserialize(testnet_raw_tx)    # THROWS py2specials.decode error ("'ascii' codec can't decode byte 0x80 in position 128: ordinal not in range(128)")

 deserialize(str(testnet_raw_tx))   # FINE