bitcoin-ruby 0.0.18 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +8 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +46 -0
  5. data/.travis.yml +5 -1
  6. data/Gemfile +11 -9
  7. data/Gemfile.lock +64 -12
  8. data/README.rdoc +17 -4
  9. data/Rakefile +58 -83
  10. data/bitcoin-ruby.gemspec +5 -2
  11. data/lib/bitcoin.rb +31 -14
  12. data/lib/bitcoin/bech32.rb +126 -132
  13. data/lib/bitcoin/bloom_filter.rb +24 -21
  14. data/lib/bitcoin/builder.rb +168 -126
  15. data/lib/bitcoin/connection.rb +21 -24
  16. data/lib/bitcoin/contracthash.rb +20 -24
  17. data/lib/bitcoin/dogecoin.rb +79 -77
  18. data/lib/bitcoin/electrum/mnemonic.rb +28 -25
  19. data/lib/bitcoin/ext_key.rb +3 -3
  20. data/lib/bitcoin/ffi/bitcoinconsensus.rb +17 -13
  21. data/lib/bitcoin/ffi/openssl.rb +355 -338
  22. data/lib/bitcoin/ffi/secp256k1.rb +97 -64
  23. data/lib/bitcoin/protocol.rb +6 -3
  24. data/lib/bitcoin/protocol/address.rb +15 -13
  25. data/lib/bitcoin/protocol/aux_pow.rb +12 -15
  26. data/lib/bitcoin/protocol/block.rb +102 -76
  27. data/lib/bitcoin/protocol/handler.rb +2 -4
  28. data/lib/bitcoin/protocol/parser.rb +108 -92
  29. data/lib/bitcoin/protocol/partial_merkle_tree.rb +59 -47
  30. data/lib/bitcoin/protocol/reject.rb +26 -28
  31. data/lib/bitcoin/protocol/script_witness.rb +3 -8
  32. data/lib/bitcoin/protocol/tx.rb +250 -137
  33. data/lib/bitcoin/protocol/txin.rb +44 -38
  34. data/lib/bitcoin/protocol/txout.rb +27 -20
  35. data/lib/bitcoin/protocol/version.rb +47 -34
  36. data/lib/bitcoin/script.rb +18 -17
  37. data/lib/bitcoin/trezor/mnemonic.rb +113 -98
  38. data/lib/bitcoin/version.rb +1 -1
  39. data/spec/examples.txt +399 -0
  40. data/spec/{bitcoin/fixtures → fixtures}/000000000000056b1a3d84a1e2b33cde8915a4b61c0cae14fca6d3e1490b4f98.json +0 -0
  41. data/spec/{bitcoin/fixtures → fixtures}/03d7e1fa4d5fefa169431f24f7798552861b255cd55d377066fedcd088fb0e99.json +0 -0
  42. data/spec/{bitcoin/fixtures → fixtures}/0961c660358478829505e16a1f028757e54b5bbf9758341a7546573738f31429.json +0 -0
  43. data/spec/{bitcoin/fixtures → fixtures}/0f24294a1d23efbb49c1765cf443fba7930702752aba6d765870082fe4f13cae.json +0 -0
  44. data/spec/{bitcoin/fixtures → fixtures}/156e6e1b84c5c3bd3a0927b25e4119fadce6e6d5186f363317511d1d680fae9a.json +0 -0
  45. data/spec/{bitcoin/fixtures → fixtures}/23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63.json +0 -0
  46. data/spec/{bitcoin/fixtures → fixtures}/315ac7d4c26d69668129cc352851d9389b4a6868f1509c6c8b66bead11e2619f.json +0 -0
  47. data/spec/{bitcoin/fixtures → fixtures}/35e2001b428891fefa0bfb73167c7360669d3cbd7b3aa78e7cad125ddfc51131.json +0 -0
  48. data/spec/{bitcoin/fixtures → fixtures}/3a17dace09ffb919ed627a93f1873220f4c975c1248558b18d16bce25d38c4b7.json +0 -0
  49. data/spec/{bitcoin/fixtures → fixtures}/3e58b7eed0fdb599019af08578effea25c8666bbe8e200845453cacce6314477.json +0 -0
  50. data/spec/{bitcoin/fixtures → fixtures}/514c46f0b61714092f15c8dfcb576c9f79b3f959989b98de3944b19d98832b58.json +0 -0
  51. data/spec/{bitcoin/fixtures → fixtures}/51bf528ecf3c161e7c021224197dbe84f9a8564212f6207baa014c01a1668e1e.json +0 -0
  52. data/spec/{bitcoin/fixtures → fixtures}/60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1.json +0 -0
  53. data/spec/{bitcoin/fixtures → fixtures}/69216b8aaa35b76d6613e5f527f4858640d986e1046238583bdad79b35e938dc.json +0 -0
  54. data/spec/{bitcoin/fixtures → fixtures}/7208e5edf525f04e705fb3390194e316205b8f995c8c9fcd8c6093abe04fa27d.json +0 -0
  55. data/spec/{bitcoin/fixtures → fixtures}/761d8c5210fdfd505f6dff38f740ae3728eb93d7d0971fb433f685d40a4c04f6.json +0 -0
  56. data/spec/{bitcoin/fixtures → fixtures}/8d0b238a06b5a70be75d543902d02d7a514d68d3252a949a513865ac3538874c.json +0 -0
  57. data/spec/{bitcoin/fixtures → fixtures}/aea682d68a3ea5e3583e088dcbd699a5d44d4b083f02ad0aaf2598fe1fa4dfd4.json +0 -0
  58. data/spec/{bitcoin/fixtures → fixtures}/base58_keys_invalid.json +0 -0
  59. data/spec/{bitcoin/fixtures → fixtures}/base58_keys_valid.json +0 -0
  60. data/spec/{bitcoin/fixtures → fixtures}/bc179baab547b7d7c1d5d8d6f8b0cc6318eaa4b0dd0a093ad6ac7f5a1cb6b3ba.json +0 -0
  61. data/spec/{bitcoin/fixtures → fixtures}/bd1715f1abfdc62bea3f605bdb461b3ba1f2cca6ec0d73a18a548b7717ca8531.json +0 -0
  62. data/spec/{bitcoin/fixtures → fixtures}/block-testnet-0000000000ac85bb2530a05a4214a387e6be02b22d3348abc5e7a5d9c4ce8dab.bin +0 -0
  63. data/spec/{bitcoin/fixtures → fixtures}/cd874fa8cb0e2ec2d385735d5e1fd482c4fe648533efb4c50ee53bda58e15ae2.json +0 -0
  64. data/spec/{bitcoin/fixtures → fixtures}/ce5fad9b4ef094d8f4937b0707edaf0a6e6ceeaf67d5edbfd51f660eac8f398b.json +0 -0
  65. data/spec/{bitcoin/fixtures → fixtures}/coinbase-toshi.json +0 -0
  66. data/spec/{bitcoin/fixtures → fixtures}/coinbase.json +0 -0
  67. data/spec/{bitcoin/fixtures → fixtures}/dogecoin-block-60323982f9c5ff1b5a954eac9dc1269352835f47c2c5222691d80f0d50dcf053.bin +0 -0
  68. data/spec/{bitcoin/fixtures → fixtures}/f003f0c1193019db2497a675fd05d9f2edddf9b67c59e677c48d3dbd4ed5f00b.json +0 -0
  69. data/spec/{bitcoin/fixtures → fixtures}/filteredblock-0.bin +0 -0
  70. data/spec/{bitcoin/fixtures → fixtures}/litecoin-block-80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f.bin +0 -0
  71. data/spec/{bitcoin/fixtures → fixtures}/litecoin-block-80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f.json +0 -0
  72. data/spec/{bitcoin/fixtures → fixtures}/litecoin-genesis-block-12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2.bin +0 -0
  73. data/spec/{bitcoin/fixtures → fixtures}/litecoin-genesis-block-12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2.json +0 -0
  74. data/spec/{bitcoin/fixtures → fixtures}/litecoin-tx-f5aa30f574e3b6f1a3d99c07a6356ba812aabb9661e1d5f71edff828cbd5c996.json +0 -0
  75. data/spec/{bitcoin/fixtures → fixtures}/rawblock-0.bin +0 -0
  76. data/spec/{bitcoin/fixtures → fixtures}/rawblock-0.json +0 -0
  77. data/spec/{bitcoin/fixtures → fixtures}/rawblock-1.bin +0 -0
  78. data/spec/{bitcoin/fixtures → fixtures}/rawblock-1.json +0 -0
  79. data/spec/{bitcoin/fixtures → fixtures}/rawblock-131025.bin +0 -0
  80. data/spec/{bitcoin/fixtures → fixtures}/rawblock-131025.json +0 -0
  81. data/spec/{bitcoin/fixtures → fixtures}/rawblock-170.bin +0 -0
  82. data/spec/{bitcoin/fixtures → fixtures}/rawblock-9.bin +0 -0
  83. data/spec/{bitcoin/fixtures → fixtures}/rawblock-auxpow.bin +0 -0
  84. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-1151351.bin +0 -0
  85. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-26478.bin +0 -0
  86. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-26478.json +0 -0
  87. data/spec/{bitcoin/fixtures → fixtures}/rawblock-testnet-265322.bin +0 -0
  88. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01-toshi.json +0 -0
  89. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01.bin +0 -0
  90. data/spec/{bitcoin/fixtures → fixtures}/rawtx-01.json +0 -0
  91. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02-toshi.json +0 -0
  92. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02.bin +0 -0
  93. data/spec/{bitcoin/fixtures → fixtures}/rawtx-02.json +0 -0
  94. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03-toshi.json +0 -0
  95. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03.bin +0 -0
  96. data/spec/{bitcoin/fixtures → fixtures}/rawtx-03.json +0 -0
  97. data/spec/{bitcoin/fixtures → fixtures}/rawtx-04.json +0 -0
  98. data/spec/{bitcoin/fixtures → fixtures}/rawtx-0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9.bin +0 -0
  99. data/spec/{bitcoin/fixtures → fixtures}/rawtx-05.json +0 -0
  100. data/spec/{bitcoin/fixtures → fixtures}/rawtx-14be6fff8c6014f7c9493b4a6e4a741699173f39d74431b6b844fcb41ebb9984.bin +0 -0
  101. data/spec/{bitcoin/fixtures → fixtures}/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.bin +0 -0
  102. data/spec/{bitcoin/fixtures → fixtures}/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.json +0 -0
  103. data/spec/{bitcoin/fixtures → fixtures}/rawtx-406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602.json +0 -0
  104. data/spec/{bitcoin/fixtures → fixtures}/rawtx-52250a162c7d03d2e1fbc5ebd1801a88612463314b55102171c5b5d817d2d7b2.bin +0 -0
  105. data/spec/{bitcoin/fixtures → fixtures}/rawtx-b5d4e8883533f99e5903ea2cf001a133a322fa6b1370b18a16c57c946a40823d.bin +0 -0
  106. data/spec/{bitcoin/fixtures → fixtures}/rawtx-ba1ff5cd66713133c062a871a8adab92416f1e38d17786b2bf56ac5f6ffdfdf5.json +0 -0
  107. data/spec/{bitcoin/fixtures → fixtures}/rawtx-c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73.json +0 -0
  108. data/spec/{bitcoin/fixtures → fixtures}/rawtx-de35d060663750b3975b7997bde7fb76307cec5b270d12fcd9c4ad98b279c28c.json +0 -0
  109. data/spec/{bitcoin/fixtures → fixtures}/rawtx-f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16.bin +0 -0
  110. data/spec/{bitcoin/fixtures → fixtures}/rawtx-p2wpkh.bin +0 -0
  111. data/spec/{bitcoin/fixtures → fixtures}/rawtx-p2wpkh.json +0 -0
  112. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-04fdc38d6722ab4b12d79113fc4b2896bdcc5169710690ee4e78541b98e467b4.bin +0 -0
  113. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-0b294c7d11dd21bcccb8393e6744fed7d4d1981a08c00e3e88838cc421f33c9f.bin +0 -0
  114. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-3bc52ac063291ad92d95ddda5fd776a342083b95607ad32ed8bc6f8f7d30449e.bin +0 -0
  115. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-6f0bbdd4e71a8af4305018d738184df32dbb6f27284fdebd5b56d16947f7c181.bin +0 -0
  116. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-a220adf1902c46a39db25a24bc4178b6a88440f977a7e2cabfdd8b5c1dd35cfb.json +0 -0
  117. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-a7c9b06e275e8674cc19a5f7d3e557c72c6d93576e635b33212dbe08ab7cdb60.bin +0 -0
  118. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.bin +0 -0
  119. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.json +0 -0
  120. data/spec/{bitcoin/fixtures → fixtures}/rawtx-testnet-f80acbd2f594d04ddb0e1cacba662132104909157dff526935a3c88abe9201a5.bin +0 -0
  121. data/spec/{bitcoin/fixtures → fixtures}/script_tests.json +0 -0
  122. data/spec/{bitcoin/fixtures → fixtures}/sighash.json +0 -0
  123. data/spec/{bitcoin/fixtures → fixtures}/tx-0295028ef826b2a188409cb905b631faebb9bb3cdf14510571c5f4bd8591338f.json +0 -0
  124. data/spec/{bitcoin/fixtures → fixtures}/tx-03339a725007a279484fb6f5361f522dd1cf4d0923d30e6b973290dba4275f92.json +0 -0
  125. data/spec/{bitcoin/fixtures → fixtures}/tx-0a6a357e2f7796444e02638749d9611c008b253fb55f5dc88b739b230ed0c4c3.json +0 -0
  126. data/spec/{bitcoin/fixtures → fixtures}/tx-0ce7e5238fbdb6c086cf1b384b21b827e91cc23f360417265874a5a0d86ce367.json +0 -0
  127. data/spec/{bitcoin/fixtures → fixtures}/tx-0ef34c49f630aea17df0080728b0fc67bf5f87fbda936934a4b11b4a69d7821e.json +0 -0
  128. data/spec/{bitcoin/fixtures → fixtures}/tx-1129d2a8bd5bb3a81e54dc96a90f1f6b2544575748caa17243470935c5dd91b7.json +0 -0
  129. data/spec/{bitcoin/fixtures → fixtures}/tx-19aa42fee0fa57c45d3b16488198b27caaacc4ff5794510d0c17f173f05587ff.json +0 -0
  130. data/spec/{bitcoin/fixtures → fixtures}/tx-1a4f3b9dc4494aeedeb39f30dd37e60541b2abe3ed4977992017cc0ad4f44956.json +0 -0
  131. data/spec/{bitcoin/fixtures → fixtures}/tx-1f9191dcf2b1844ca28c6ef4b969e1d5fab70a5e3c56b7007949e55851cb0c4f.json +0 -0
  132. data/spec/{bitcoin/fixtures → fixtures}/tx-22cd5fef23684d7b304e119bedffde6f54538d3d54a5bfa237e20dc2d9b4b5ad.json +0 -0
  133. data/spec/{bitcoin/fixtures → fixtures}/tx-28204cad1d7fc1d199e8ef4fa22f182de6258a3eaafe1bbe56ebdcacd3069a5f.json +0 -0
  134. data/spec/{bitcoin/fixtures → fixtures}/tx-2958fb00b4fd6fe0353503b886eb9a193d502f4fd5fc042d5e03216ba918bbd6.json +0 -0
  135. data/spec/{bitcoin/fixtures → fixtures}/tx-29f277145749ad6efbed3ae6ce301f8d33c585ec26b7c044ad93c2f866e9e942.json +0 -0
  136. data/spec/{bitcoin/fixtures → fixtures}/tx-2c5e5376c20e9cc78d0fb771730e5d840cc2096eff0ef045b599fe92475ace1c.json +0 -0
  137. data/spec/{bitcoin/fixtures → fixtures}/tx-2c63aa814701cef5dbd4bbaddab3fea9117028f2434dddcdab8339141e9b14d1.json +0 -0
  138. data/spec/{bitcoin/fixtures → fixtures}/tx-313897799b1e37e9ecae15010e56156dddde4e683c96b0e713af95272c38aee0.json +0 -0
  139. data/spec/{bitcoin/fixtures → fixtures}/tx-326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e.json +0 -0
  140. data/spec/{bitcoin/fixtures → fixtures}/tx-345bed8785c3282a264ffb0dbee61cde54854f10e16f1b3e75b7f2d9f62946f2.json +0 -0
  141. data/spec/{bitcoin/fixtures → fixtures}/tx-39ba7440b7103557560cc8ce258009936796485aaf8b478e66ab4cb97c66e31b.json +0 -0
  142. data/spec/{bitcoin/fixtures → fixtures}/tx-3a04d57a833367f1655cc5ec3beb587888ef4977a86caa8c8ad4ba7cc717eae7.json +0 -0
  143. data/spec/{bitcoin/fixtures → fixtures}/tx-3da75972766f0ad13319b0b461fd16823a731e44f6e9de4eb3c52d6a6fb6c8ae.json +0 -0
  144. data/spec/{bitcoin/fixtures → fixtures}/tx-4142ee4877eb116abf955a7ec6ef2dc38133b793df762b76d75e3d7d4d8badc9.json +0 -0
  145. data/spec/{bitcoin/fixtures → fixtures}/tx-44b833074e671120ba33106877b49e86ece510824b9af477a3853972bcd8d06a.json +0 -0
  146. data/spec/{bitcoin/fixtures → fixtures}/tx-46224764c7870f95b58f155bce1e38d4da8e99d42dbb632d0dd7c07e092ee5aa.json +0 -0
  147. data/spec/{bitcoin/fixtures → fixtures}/tx-5df1375ffe61ac35ca178ebb0cab9ea26dedbd0e96005dfcee7e379fa513232f.json +0 -0
  148. data/spec/{bitcoin/fixtures → fixtures}/tx-62d9a565bd7b5344c5352e3e9e5f40fa4bbd467fa19c87357216ec8777ba1cce.json +0 -0
  149. data/spec/{bitcoin/fixtures → fixtures}/tx-6327783a064d4e350c454ad5cd90201aedf65b1fc524e73709c52f0163739190.json +0 -0
  150. data/spec/{bitcoin/fixtures → fixtures}/tx-6606c366a487bff9e412d0b6c09c14916319932db5954bf5d8719f43f828a3ba.json +0 -0
  151. data/spec/{bitcoin/fixtures → fixtures}/tx-6aaf18b9f1283b939d8e5d40ff5f8a435229f4178372659cc3a0bce4e262bf78.json +0 -0
  152. data/spec/{bitcoin/fixtures → fixtures}/tx-6b48bba6f6d2286d7ec0883c0fc3085955090813a4c94980466611c798b868cc.json +0 -0
  153. data/spec/{bitcoin/fixtures → fixtures}/tx-70cfbc6690f9ab46712db44e3079ac227962b2771a9341d4233d898b521619ef.json +0 -0
  154. data/spec/{bitcoin/fixtures → fixtures}/tx-7a1a9db42f065f75110fcdb1bc415549c8ef7670417ba1d35a67f1b8adc562c1.json +0 -0
  155. data/spec/{bitcoin/fixtures → fixtures}/tx-9a768fc7d0c4bdc86e25154357ef7c0063ca21310e5740a2f12f90b7455184a7.json +0 -0
  156. data/spec/{bitcoin/fixtures → fixtures}/tx-9cad8d523a0694f2509d092c39cebc8046adae62b4e4297102d568191d9478d8.json +0 -0
  157. data/spec/{bitcoin/fixtures → fixtures}/tx-9e052eb694bd7e15906433f064dff0161a12fd325c1124537766377004023c6f.json +0 -0
  158. data/spec/{bitcoin/fixtures → fixtures}/tx-9fb65b7304aaa77ac9580823c2c06b259cc42591e5cce66d76a81b6f51cc5c28.json +0 -0
  159. data/spec/{bitcoin/fixtures → fixtures}/tx-a6ce7081addade7676cd2af75c4129eba6bf5e179a19c40c7d4cf6a5fe595954.json +0 -0
  160. data/spec/{bitcoin/fixtures → fixtures}/tx-a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944.json +0 -0
  161. data/spec/{bitcoin/fixtures → fixtures}/tx-aab7ef280abbb9cc6fbaf524d2645c3daf4fcca2b3f53370e618d9cedf65f1f8.json +0 -0
  162. data/spec/{bitcoin/fixtures → fixtures}/tx-ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742.json +0 -0
  163. data/spec/{bitcoin/fixtures → fixtures}/tx-ad4bcf3241e5d2ad140564e20db3567d41594cf4c2012433fe46a2b70e0d87b8.json +0 -0
  164. data/spec/{bitcoin/fixtures → fixtures}/tx-b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9.json +0 -0
  165. data/spec/{bitcoin/fixtures → fixtures}/tx-b8fd633e7713a43d5ac87266adc78444669b987a56b3a65fb92d58c2c4b0e84d.json +0 -0
  166. data/spec/{bitcoin/fixtures → fixtures}/tx-bbca0628c42cb8bf7c3f4b2ad688fa56da5308dd2a10255da89fb1f46e6e413d.json +0 -0
  167. data/spec/{bitcoin/fixtures → fixtures}/tx-bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224.json +0 -0
  168. data/spec/{bitcoin/fixtures → fixtures}/tx-c192b74844e4837a34c4a5a97b438f1c111405b01b99e2d12b7c96d07fc74c04.json +0 -0
  169. data/spec/{bitcoin/fixtures → fixtures}/tx-d3d77d63709e47d9ef58f0b557800115a6b676c6a423012fbb96f45d8fcef830.json +0 -0
  170. data/spec/{bitcoin/fixtures → fixtures}/tx-e335562f7e297aadeed88e5954bc4eeb8dc00b31d829eedb232e39d672b0c009.json +0 -0
  171. data/spec/{bitcoin/fixtures → fixtures}/tx-eb3b82c0884e3efa6d8b0be55b4915eb20be124c9766245bcc7f34fdac32bccb.json +0 -0
  172. data/spec/{bitcoin/fixtures → fixtures}/tx-fee1b9b85531c8fb6cd7831f83490c7f2aa768b6eefe29854ef5e89ce7b9ecb1.json +0 -0
  173. data/spec/{bitcoin/fixtures → fixtures}/txscript-invalid-too-many-sigops-followed-by-invalid-pushdata.bin +0 -0
  174. data/spec/helpers/block_helpers.rb +58 -0
  175. data/spec/helpers/fixture_helpers.rb +20 -0
  176. data/spec/helpers/library_helpers.rb +15 -0
  177. data/spec/spec_helper.rb +109 -0
  178. data/spec/unit/bitcoin/bech32_spec.rb +187 -0
  179. data/spec/unit/bitcoin/bitcoin_spec.rb +1079 -0
  180. data/spec/unit/bitcoin/bloom_filter_spec.rb +33 -0
  181. data/spec/unit/bitcoin/builder_spec.rb +559 -0
  182. data/spec/unit/bitcoin/contracthash_spec.rb +52 -0
  183. data/spec/unit/bitcoin/ext_key_spec.rb +281 -0
  184. data/spec/unit/bitcoin/key_spec.rb +457 -0
  185. data/spec/unit/bitcoin/network_spec.rb +71 -0
  186. data/spec/unit/bitcoin/protocol/addr_spec.rb +90 -0
  187. data/spec/unit/bitcoin/protocol/aux_pow_spec.rb +45 -0
  188. data/spec/unit/bitcoin/protocol/bip143_spec.rb +334 -0
  189. data/spec/unit/bitcoin/protocol/block_spec.rb +280 -0
  190. data/spec/unit/bitcoin/protocol/getblocks_spec.rb +44 -0
  191. data/spec/unit/bitcoin/protocol/inv_spec.rb +166 -0
  192. data/spec/unit/bitcoin/protocol/notfound_spec.rb +44 -0
  193. data/spec/unit/bitcoin/protocol/parser_spec.rb +69 -0
  194. data/spec/unit/bitcoin/protocol/partial_merkle_tree_spec.rb +47 -0
  195. data/spec/unit/bitcoin/protocol/ping_spec.rb +62 -0
  196. data/spec/unit/bitcoin/protocol/tx_spec.rb +1515 -0
  197. data/spec/unit/bitcoin/protocol/txin_spec.rb +47 -0
  198. data/spec/unit/bitcoin/protocol/txout_spec.rb +36 -0
  199. data/spec/unit/bitcoin/protocol/version_spec.rb +121 -0
  200. data/spec/unit/bitcoin/script/opcodes_spec.rb +864 -0
  201. data/spec/unit/bitcoin/script/script_spec.rb +1610 -0
  202. data/spec/unit/bitcoin/secp256k1_spec.rb +138 -0
  203. data/spec/unit/bitcoin/trezor/mnemonic_spec.rb +193 -0
  204. data/spec/unit/integrations/dogecoin_spec.rb +215 -0
  205. metadata +381 -372
  206. data/lib/bitcoin/logger.rb +0 -86
  207. data/lib/bitcoin/protocol/alert.rb +0 -46
  208. data/spec/bitcoin/bech32_spec.rb +0 -160
  209. data/spec/bitcoin/bitcoin_spec.rb +0 -666
  210. data/spec/bitcoin/bloom_filter_spec.rb +0 -23
  211. data/spec/bitcoin/builder_spec.rb +0 -375
  212. data/spec/bitcoin/contracthash_spec.rb +0 -45
  213. data/spec/bitcoin/dogecoin_spec.rb +0 -176
  214. data/spec/bitcoin/ext_key_spec.rb +0 -180
  215. data/spec/bitcoin/ffi_openssl.rb +0 -45
  216. data/spec/bitcoin/fixtures/rawblock-170.json +0 -68
  217. data/spec/bitcoin/fixtures/rawblock-9.json +0 -39
  218. data/spec/bitcoin/fixtures/reorg/blk_0_to_4.dat +0 -0
  219. data/spec/bitcoin/fixtures/reorg/blk_3A.dat +0 -0
  220. data/spec/bitcoin/fixtures/reorg/blk_4A.dat +0 -0
  221. data/spec/bitcoin/fixtures/reorg/blk_5A.dat +0 -0
  222. data/spec/bitcoin/fixtures/testnet/block_0.bin +0 -0
  223. data/spec/bitcoin/fixtures/testnet/block_1.bin +0 -0
  224. data/spec/bitcoin/fixtures/testnet/block_2.bin +0 -0
  225. data/spec/bitcoin/fixtures/testnet/block_3.bin +0 -0
  226. data/spec/bitcoin/fixtures/testnet/block_4.bin +0 -0
  227. data/spec/bitcoin/fixtures/testnet/block_5.bin +0 -0
  228. data/spec/bitcoin/fixtures/txdp-1.txt +0 -32
  229. data/spec/bitcoin/fixtures/txdp-2-signed.txt +0 -19
  230. data/spec/bitcoin/fixtures/txdp-2-unsigned.txt +0 -14
  231. data/spec/bitcoin/helpers/fake_blockchain.rb +0 -183
  232. data/spec/bitcoin/key_spec.rb +0 -326
  233. data/spec/bitcoin/network_spec.rb +0 -50
  234. data/spec/bitcoin/performance/storage_spec.rb +0 -41
  235. data/spec/bitcoin/protocol/addr_spec.rb +0 -82
  236. data/spec/bitcoin/protocol/alert_spec.rb +0 -22
  237. data/spec/bitcoin/protocol/aux_pow_spec.rb +0 -45
  238. data/spec/bitcoin/protocol/bip143_spec.rb +0 -116
  239. data/spec/bitcoin/protocol/block_spec.rb +0 -208
  240. data/spec/bitcoin/protocol/getblocks_spec.rb +0 -32
  241. data/spec/bitcoin/protocol/inv_spec.rb +0 -134
  242. data/spec/bitcoin/protocol/notfound_spec.rb +0 -31
  243. data/spec/bitcoin/protocol/parser_spec.rb +0 -50
  244. data/spec/bitcoin/protocol/partial_merkle_tree_spec.rb +0 -38
  245. data/spec/bitcoin/protocol/ping_spec.rb +0 -51
  246. data/spec/bitcoin/protocol/reject.rb +0 -17
  247. data/spec/bitcoin/protocol/tx_spec.rb +0 -894
  248. data/spec/bitcoin/protocol/txin_spec.rb +0 -45
  249. data/spec/bitcoin/protocol/txout_spec.rb +0 -33
  250. data/spec/bitcoin/protocol/version_spec.rb +0 -110
  251. data/spec/bitcoin/script/opcodes_spec.rb +0 -773
  252. data/spec/bitcoin/script/script_spec.rb +0 -977
  253. data/spec/bitcoin/secp256k1_spec.rb +0 -78
  254. data/spec/bitcoin/spec_helper.rb +0 -108
  255. data/spec/bitcoin/trezor/mnemonic_spec.rb +0 -161
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Bitcoin::Secp256k1 do
6
+ let(:fixture_text) { 'bitcoin-ruby-test-data' }
7
+
8
+ describe '#generate_key_pair' do
9
+ it 'generates a compressed key pair' do
10
+ private_key, public_key =
11
+ Bitcoin::Secp256k1.generate_key_pair(true)
12
+
13
+ expect(private_key.bytesize).to eq(32)
14
+ expect(public_key.bytesize).to eq(33)
15
+ expect(["\x03", "\x02"]).to include(public_key[0])
16
+ end
17
+
18
+ it 'generates an uncompressed key pair' do
19
+ private_key, public_key =
20
+ Bitcoin::Secp256k1.generate_key_pair(false)
21
+
22
+ expect(private_key.bytesize).to eq(32)
23
+ expect(public_key.bytesize).to eq(65)
24
+ expect(public_key[0]).to eq("\x04")
25
+ end
26
+ end
27
+
28
+ describe '#generate_key' do
29
+ it 'generates a compressed key' do
30
+ key = Bitcoin::Secp256k1.generate_key(true)
31
+ expect(key.compressed).to be true
32
+ end
33
+
34
+ it 'generates an uncompressed key' do
35
+ key = Bitcoin::Secp256k1.generate_key(false)
36
+ expect(key.compressed).to be false
37
+ end
38
+ end
39
+
40
+ describe '#sign' do
41
+ it 'successfully signs and verifies text' do
42
+ private_key, public_key = Bitcoin::Secp256k1.generate_key_pair
43
+ signature = Bitcoin::Secp256k1.sign(fixture_text, private_key)
44
+
45
+ expect(
46
+ Bitcoin::Secp256k1.verify(fixture_text, signature, public_key)
47
+ ).to be true
48
+ expect(
49
+ Bitcoin::Secp256k1.verify(fixture_text.upcase, signature, public_key)
50
+ ).to be false
51
+ end
52
+
53
+ it 'supports RFC6979 deterministic signatures' do
54
+ private_key, = Bitcoin::Secp256k1.generate_key_pair
55
+ first = Bitcoin::Secp256k1.sign(fixture_text, private_key)
56
+ second = Bitcoin::Secp256k1.sign(fixture_text, private_key)
57
+ expect(first).to eq(second)
58
+
59
+ private_key, = Bitcoin::Secp256k1.generate_key_pair
60
+ second = Bitcoin::Secp256k1.sign(fixture_text, private_key)
61
+ expect(first).not_to eq(second)
62
+ end
63
+ end
64
+
65
+ describe '#sign_compact' do
66
+ it 'signs and recovers with compressed keys' do
67
+ private_key, public_key = Bitcoin::Secp256k1.generate_key_pair(true)
68
+
69
+ signature = Bitcoin::Secp256k1.sign_compact(
70
+ fixture_text, private_key, true
71
+ )
72
+ expect(signature.bytesize).to eq(65)
73
+
74
+ recovered_public_key = Bitcoin::Secp256k1.recover_compact(
75
+ fixture_text, signature
76
+ )
77
+ expect(recovered_public_key.bytesize).to eq(33)
78
+ expect(recovered_public_key).to eq(public_key)
79
+ end
80
+
81
+ it 'signs and recovers with uncompressed keys' do
82
+ private_key, public_key = Bitcoin::Secp256k1.generate_key_pair(false)
83
+ signature = Bitcoin::Secp256k1.sign_compact(
84
+ fixture_text, private_key, false
85
+ )
86
+ expect(signature.bytesize).to eq(65)
87
+
88
+ recovered_public_key = Bitcoin::Secp256k1.recover_compact(
89
+ fixture_text, signature
90
+ )
91
+
92
+ expect(recovered_public_key.bytesize).to eq(65)
93
+ expect(recovered_public_key).to eq(public_key)
94
+ end
95
+
96
+ context 'when compared to OpenSSL' do
97
+ let(:message) { 'hello world' }
98
+
99
+ it 'has matching signing and recovery results' do
100
+ key = Bitcoin::Key.new(
101
+ '82a0c421a0f67c7a88a329b2c15f2849aa1c8cfa9c9a6513f056f80ee8eaacc4',
102
+ nil,
103
+ false
104
+ )
105
+
106
+ expect(key.pub)
107
+ .to eq('0490b0854581a291b83c1945775f156da22445df99e445581321ac3aa62' \
108
+ '535ff369334316dfd157acc7bb2e4d3eb85951f6d1b7f62f6f60a09e0db' \
109
+ 'd5c87d3ffae9')
110
+
111
+ private_key_binary = [key.priv].pack('H*')
112
+
113
+ openssl_signature = Bitcoin::OpenSSL_EC.sign_compact(
114
+ message, private_key_binary, nil, false
115
+ )
116
+ libsecp_signature = Bitcoin::Secp256k1.sign_compact(
117
+ message, private_key_binary, false
118
+ )
119
+
120
+ expect(
121
+ Bitcoin::OpenSSL_EC.recover_compact(message, openssl_signature)
122
+ ).to eq(key.pub)
123
+ expect(
124
+ Bitcoin::Secp256k1.recover_compact(message, openssl_signature)
125
+ .unpack('H*')[0]
126
+ ).to eq(key.pub)
127
+
128
+ expect(
129
+ Bitcoin::OpenSSL_EC.recover_compact(message, libsecp_signature)
130
+ ).to eq(key.pub)
131
+ expect(
132
+ Bitcoin::Secp256k1.recover_compact(message, libsecp_signature)
133
+ .unpack('H*')[0]
134
+ ).to eq(key.pub)
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,193 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Bitcoin::Trezor::Mnemonic' do
7
+ # https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#Test_vectors
8
+ # https://github.com/trezor/python-mnemonic/blob/master/vectors.json
9
+ it 'test vectors' do
10
+ [
11
+ [
12
+ '00000000000000000000000000000000',
13
+ 'abandon abandon abandon abandon abandon abandon abandon abandon ' \
14
+ 'abandon abandon abandon about',
15
+ 'c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e5349553' \
16
+ '1f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04'
17
+ ],
18
+ [
19
+ '7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f',
20
+ 'legal winner thank year wave sausage worth useful legal winner ' \
21
+ 'thank yellow',
22
+ '2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa4' \
23
+ '57fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607'
24
+ ],
25
+ [
26
+ '80808080808080808080808080808080',
27
+ 'letter advice cage absurd amount doctor acoustic avoid letter ' \
28
+ 'advice cage above',
29
+ 'd71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30f' \
30
+ 'a280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8'
31
+ ],
32
+ [
33
+ 'ffffffffffffffffffffffffffffffff',
34
+ 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong',
35
+ 'ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a1333' \
36
+ '2572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069'
37
+ ],
38
+ [
39
+ '000000000000000000000000000000000000000000000000',
40
+ 'abandon abandon abandon abandon abandon abandon abandon abandon ' \
41
+ 'abandon abandon abandon abandon abandon abandon abandon abandon ' \
42
+ 'abandon agent',
43
+ '035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06' \
44
+ 'da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa'
45
+ ],
46
+ [
47
+ '7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f',
48
+ 'legal winner thank year wave sausage worth useful legal winner ' \
49
+ 'thank year wave sausage worth useful legal will',
50
+ 'f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c' \
51
+ '7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd'
52
+ ],
53
+ [
54
+ '808080808080808080808080808080808080808080808080',
55
+ 'letter advice cage absurd amount doctor acoustic avoid letter ' \
56
+ 'advice cage absurd amount doctor acoustic avoid letter always',
57
+ '107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27' \
58
+ 'fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65'
59
+ ],
60
+ [
61
+ 'ffffffffffffffffffffffffffffffffffffffffffffffff',
62
+ 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo ' \
63
+ 'zoo when',
64
+ '0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76' \
65
+ '379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528'
66
+ ],
67
+ [
68
+ '0000000000000000000000000000000000000000000000000000000000000000',
69
+ 'abandon abandon abandon abandon abandon abandon abandon abandon ' \
70
+ 'abandon abandon abandon abandon abandon abandon abandon abandon ' \
71
+ 'abandon abandon abandon abandon abandon abandon abandon art',
72
+ 'bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170' \
73
+ 'af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8'
74
+ ],
75
+ [
76
+ '7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f',
77
+ 'legal winner thank year wave sausage worth useful legal winner ' \
78
+ 'thank year wave sausage worth useful legal winner thank year wave ' \
79
+ 'sausage worth title',
80
+ 'bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021' \
81
+ 'b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87'
82
+ ],
83
+ [
84
+ '8080808080808080808080808080808080808080808080808080808080808080',
85
+ 'letter advice cage absurd amount doctor acoustic avoid letter ' \
86
+ 'advice cage absurd amount doctor acoustic avoid letter advice ' \
87
+ 'cage absurd amount doctor acoustic bless',
88
+ 'c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e' \
89
+ '2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f'
90
+ ],
91
+ [
92
+ 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
93
+ 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo ' \
94
+ 'zoo zoo zoo zoo zoo zoo zoo vote',
95
+ 'dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613' \
96
+ '912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad'
97
+ ],
98
+ [
99
+ '77c2b00716cec7213839159e404db50d',
100
+ 'jelly better achieve collect unaware mountain thought cargo ' \
101
+ 'oxygen act hood bridge',
102
+ 'b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52' \
103
+ '676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff'
104
+ ],
105
+ [
106
+ 'b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b',
107
+ 'renew stay biology evidence goat welcome casual join adapt armor ' \
108
+ 'shuffle fault little machine walk stumble urge swap',
109
+ '9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c393' \
110
+ '66941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5'
111
+ ],
112
+ [
113
+ '3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982',
114
+ 'dignity pass list indicate nasty swamp pool script soccer toe ' \
115
+ 'leaf photo multiply desk host tomato cradle drill spread actor ' \
116
+ 'shine dismiss champion exotic',
117
+ 'ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9' \
118
+ '635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67'
119
+ ],
120
+ [
121
+ '0460ef47585604c5660618db2e6a7e7f',
122
+ 'afford alter spike radar gate glance object seek swamp infant ' \
123
+ 'panel yellow',
124
+ '65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf' \
125
+ '76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4'
126
+ ],
127
+ [
128
+ '72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f',
129
+ 'indicate race push merry suffer human cruise dwarf pole review ' \
130
+ 'arch keep canvas theme poem divorce alter left',
131
+ '3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289' \
132
+ '349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba'
133
+ ],
134
+ [
135
+ '2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416',
136
+ 'clutch control vehicle tonight unusual clog visa ice plunge ' \
137
+ 'glimpse recipe series open hour vintage deposit universe tip ' \
138
+ 'job dress radar refuse motion taste',
139
+ 'fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f106469' \
140
+ '4a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449'
141
+ ],
142
+ [
143
+ 'eaebabb2383351fd31d703840b32e9e2',
144
+ 'turtle front uncle idea crush write shrug there lottery flower ' \
145
+ 'risk shell',
146
+ 'bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42' \
147
+ 'a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c'
148
+ ],
149
+ [
150
+ '7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78',
151
+ 'kiss carry display unusual confirm curtain upgrade antique ' \
152
+ 'rotate hello void custom frequent obey nut hole price segment',
153
+ 'ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4' \
154
+ 'f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79'
155
+ ],
156
+ [
157
+ '4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef',
158
+ 'exile ask congress lamp submit jacket era scheme attend cousin ' \
159
+ 'alcohol catch course end lucky hurt sentence oven short ball ' \
160
+ 'bird grab wing top',
161
+ '095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c0' \
162
+ '96a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c'
163
+ ],
164
+ [
165
+ '18ab19a9f54a9274f03e5209a2ac8a91',
166
+ 'board flee heavy tunnel powder denial science ski answer betray ' \
167
+ 'cargo cat',
168
+ '6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300' \
169
+ 'bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8'
170
+ ],
171
+ [
172
+ '18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4',
173
+ 'board blade invite damage undo sun mimic interest slam gaze ' \
174
+ 'truly inherit resist great inject rocket museum chief',
175
+ 'f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864e' \
176
+ 'e6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9'
177
+ ],
178
+ [
179
+ '15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419',
180
+ 'beyond stage sleep clip because twist token leaf atom beauty ' \
181
+ 'genius food business side grid unable middle armed observe pair ' \
182
+ 'crouch tonight away coconut',
183
+ 'b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65' \
184
+ '101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd'
185
+ ]
186
+ ].each do |data, expected_mnemonic, expected_seed|
187
+ mnemonic = Bitcoin::Trezor::Mnemonic.to_mnemonic([data].pack('H*'))
188
+ expect(mnemonic).to eq(expected_mnemonic)
189
+ expect(Bitcoin::Trezor::Mnemonic.to_seed(expected_mnemonic, 'TREZOR'))
190
+ .to eq(expected_seed)
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,215 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Bitcoin::Dogecoin do
7
+ it 'validate dogecoin-address' do
8
+ Bitcoin.network = :dogecoin_testnet
9
+
10
+ # Testnet address
11
+ expect(Bitcoin.valid_address?('nUtMFED5VRg5xuj9QCrNFt9mVPFDXo7TTE'))
12
+ .to be true
13
+ # Livenet address
14
+ expect(Bitcoin.valid_address?('DSpgzjPyfQB6ZzeSbMWpaZiTTxGf2oBCs4'))
15
+ .to be false
16
+ # Broken address
17
+ expect(Bitcoin.valid_address?('DRjyUS2uuieEPkhZNdQz8hE5YycxVEqSXA'))
18
+ .to be false
19
+
20
+ Bitcoin.network = :dogecoin
21
+
22
+ # Testnet address
23
+ expect(Bitcoin.valid_address?('nUtMFED5VRg5xuj9QCrNFt9mVPFDXo7TTE'))
24
+ .to be false
25
+ # Livenet address
26
+ expect(Bitcoin.valid_address?('DSpgzjPyfQB6ZzeSbMWpaZiTTxGf2oBCs4'))
27
+ .to be true
28
+ # Broken address
29
+ expect(Bitcoin.valid_address?('DRjyUS2uuieEPkhZNdQz8hE5YycxVEqSXA'))
30
+ .to be false
31
+ end
32
+
33
+ it 'should calculate retarget difficulty' do
34
+ Bitcoin.network = :dogecoin
35
+
36
+ prev_height = 239
37
+ prev_block_time = 1_386_475_638 # Block 239
38
+ prev_block_bits = 0x1e0ffff0
39
+ last_retarget_time = 1_386_474_927 # Block 1
40
+ new_difficulty = Bitcoin.block_new_target(
41
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
42
+ )
43
+ expect(new_difficulty.to_s(16)).to eq(0x1e00ffff.to_s(16))
44
+
45
+ prev_height = 479
46
+ prev_block_time = 1_386_475_840
47
+ prev_block_bits = 0x1e0fffff
48
+ last_retarget_time = 1_386_475_638 # Block 239
49
+ new_difficulty = Bitcoin.block_new_target(
50
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
51
+ )
52
+ expect(new_difficulty.to_s(16)).to eq(0x1e00ffff.to_s(16))
53
+
54
+ prev_height = 9_599
55
+ prev_block_time = 1_386_954_113
56
+ prev_block_bits = 0x1c1a1206
57
+ last_retarget_time = 1_386_942_008 # Block 9359
58
+ new_difficulty = Bitcoin.block_new_target(
59
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
60
+ )
61
+ expect(new_difficulty.to_s(16)).to eq(0x1c15ea59.to_s(16))
62
+
63
+ # First hard-fork at 145,000, which applies to block 145,001 onwards
64
+ prev_height = 145_000
65
+ prev_block_time = 1_395_094_679
66
+ prev_block_bits = 0x1b499dfd
67
+ last_retarget_time = 1_395_094_427
68
+ new_difficulty = Bitcoin.block_new_target(
69
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
70
+ )
71
+ expect(new_difficulty.to_s(16)).to eq(0x1b671062.to_s(16))
72
+
73
+ # Test case for correct rounding of modulated time - by default C++ and Ruby
74
+ # do not necessarily round identically
75
+ prev_height = 145_001
76
+ prev_block_time = 1_395_094_727
77
+ prev_block_bits = 0x1b671062
78
+ last_retarget_time = 1_395_094_679
79
+ new_difficulty = Bitcoin.block_new_target(
80
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
81
+ )
82
+ expect(new_difficulty.to_s(16)).to eq(0x1b6558a4.to_s(16))
83
+
84
+ # Test the second hard-fork at 371,337 as well
85
+ prev_height = 371_336
86
+ prev_block_time = 1_410_464_569
87
+ prev_block_bits = 0x1b2fdf75
88
+ last_retarget_time = 1_410_464_445
89
+ new_difficulty = Bitcoin.block_new_target(
90
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
91
+ )
92
+ expect(new_difficulty.to_s(16)).to eq(0x1b364184.to_s(16))
93
+
94
+ prev_height = 408_596
95
+ prev_block_time = 1_412_800_112
96
+ prev_block_bits = 0x1b033d8b
97
+ last_retarget_time = 1_412_799_989 # Block 408,595
98
+ new_difficulty = Bitcoin.block_new_target(
99
+ prev_height, prev_block_time, prev_block_bits, last_retarget_time
100
+ )
101
+ expect(new_difficulty.to_s(16)).to eq(0x1b039e52.to_s(16))
102
+ end
103
+
104
+ it 'should calculate reward upper bounds' do
105
+ Bitcoin.network = :dogecoin
106
+
107
+ # Note this is the maximum possible, not actual reward
108
+ expect(Bitcoin.block_creation_reward(99_000)).to eq(1_000_000 * Bitcoin::COIN)
109
+ # Hard-forked to remove random rewards
110
+ expect(Bitcoin.block_creation_reward(144_999)).to eq(500_000 * Bitcoin::COIN)
111
+ expect(Bitcoin.block_creation_reward(145_000)).to eq(250_000 * Bitcoin::COIN)
112
+ expect(Bitcoin.block_creation_reward(199_999)).to eq(250_000 * Bitcoin::COIN)
113
+ expect(Bitcoin.block_creation_reward(299_999)).to eq(125_000 * Bitcoin::COIN)
114
+ expect(Bitcoin.block_creation_reward(399_999)).to eq(62_500 * Bitcoin::COIN)
115
+ expect(Bitcoin.block_creation_reward(499_999)).to eq(31_250 * Bitcoin::COIN)
116
+ expect(Bitcoin.block_creation_reward(599_999)).to eq(15_625 * Bitcoin::COIN)
117
+ expect(Bitcoin.block_creation_reward(600_000)).to eq(10_000 * Bitcoin::COIN)
118
+ expect(Bitcoin.block_creation_reward(700_000)).to eq(10_000 * Bitcoin::COIN)
119
+ end
120
+
121
+ it 'should calculate merkle root from AuxPoW transaction branch' do
122
+ # Taken directly from Dogecoin block #403,931
123
+
124
+ # Branch stored as bytes to reflect how data is stored in AuxPow class
125
+ branch = [
126
+ "\xbe\x07\x90\x78\x86\x93\x99\xfa\xcc\xaa\x76\x4c\x10\xe9\xdf\x6e\x99" \
127
+ "\x81\x70\x17\x59\xad\x18\xe1\x37\x24\xd9\xca\x58\x83\x13\x48",
128
+ "\x5f\x5b\xfb\x2c\x79\x54\x17\x78\x49\x9c\xab\x95\x6a\x10\x38\x87\x14" \
129
+ "\x7f\x2a\xb5\xd4\xa7\x17\xf3\x2f\x9e\xee\xbd\x29\xe1\xf8\x94",
130
+ "\xd8\xc6\xfe\x42\xca\x25\x07\x61\x59\xcd\x12\x1a\x5e\x20\xc4\x8c\x1b" \
131
+ "\xc5\x3a\xb9\x07\x30\x08\x3e\x44\xa3\x34\x56\x6e\xa6\xbb\xcb"
132
+ ]
133
+ mrkl_index = 0
134
+ # Coinbase TX ID
135
+ target = '089b911f5e471c0e1800f3384281ebec5b372fbb6f358790a92747ade271ccdf'
136
+ expect(Bitcoin.mrkl_branch_root(branch.map(&:hth), target, mrkl_index))
137
+ .to eq('f29cd14243ed542d9a0b495efcb9feca1b208bb5b717dc5ac04f068d2fef595a')
138
+ end
139
+
140
+ it 'should calculate merkle root from AuxPoW branch' do
141
+ # Taken directly from Dogecoin block #403,931
142
+
143
+ # Branch stored as bytes to reflect how data is stored in AuxPow class
144
+ aux_branch = [
145
+ "\x47\xa0\x22\x8b\x06\xc9\x36\x8f\x96\xc5\xf0\x4e\xb1\x09\xf8\x2c\xef" \
146
+ "\x36\xda\xe7\xc1\xbf\x25\x4c\x1a\x3f\x78\x61\x5e\xb0\xbe\x83",
147
+ "\xee\x67\xde\x31\x75\x76\x58\xdd\xd7\x40\x3e\x1a\x35\xd9\xc0\x6a\x5a" \
148
+ "\x13\xe6\x68\x98\x44\x3b\x45\x8c\xd6\xa7\x1b\x66\x27\x41\x6c",
149
+ "\xab\x9e\xf9\xbd\xa0\x2c\xad\x27\x90\xef\x9b\xb7\xc9\xa0\x7f\xe1\x79" \
150
+ "\x1a\x9d\x5a\xe0\x43\x09\xc0\xe9\x06\x48\x19\x19\x4c\x28\x31",
151
+ "\xff\x51\x61\x01\x80\xf6\x4d\x33\xa8\xc1\xba\x1d\xd9\xa9\xd0\x40\x48" \
152
+ "\x88\xc9\x6e\xaf\xd1\x57\x03\x64\x35\x8b\xbe\x99\x8f\x2d\xfe",
153
+ "\x9e\xe4\x18\x36\x7c\x3b\xce\x06\x5e\x7c\x01\x61\x29\x6e\xaa\x0d\x54" \
154
+ "\x96\xf9\x0f\x8b\x7b\x24\xeb\xf7\x2c\xc4\xba\xa5\x60\x9a\x1f",
155
+ "\x0b\x35\xf3\x73\x10\xe1\xde\x3f\xa4\xe1\x37\x7c\x02\x12\x62\x20\xe1" \
156
+ "\x64\xfa\x59\xec\xfe\xdc\xf4\x71\x4e\x61\xad\x74\xcc\x4b\x08"
157
+ ]
158
+ aux_mrkl_index = 56
159
+ # Block hash
160
+ target = '0c836b86991631d34a8a68054e2f62db919b39d1ee43c27ab3344d6aa82fa609'
161
+ # Merkle root in coinbase script
162
+ expect(Bitcoin.mrkl_branch_root(aux_branch.map(&:hth), target, aux_mrkl_index))
163
+ .to eq('ce3040fdb7e37484f6a1ca4f8f5da81e6b7e404ec91102315a233e03a0c39c95')
164
+ end
165
+
166
+ it 'parse AuxPoW' do
167
+ Bitcoin.network = :dogecoin
168
+
169
+ block_hash = '60323982f9c5ff1b5a954eac9dc1269352835f47c2c5222691d80f0d50dcf053'
170
+ data = fixtures_file("dogecoin-block-#{block_hash}.bin")
171
+ block = Bitcoin::Protocol::Block.new(data)
172
+ aux_pow = block.aux_pow
173
+ expect(aux_pow).not_to be_nil
174
+ expect(aux_pow.coinbase_index).to eq(0)
175
+
176
+ parent_block_merkle_root = Bitcoin.mrkl_branch_root(
177
+ aux_pow.coinbase_branch, aux_pow.coinbase_tx.hash, aux_pow.coinbase_index
178
+ )
179
+ expect(parent_block_merkle_root)
180
+ .to eq(aux_pow.parent_block.mrkl_root.reverse.unpack('H*')[0])
181
+
182
+ # Find the merged mining header in the coinbase input script
183
+ merged_mining_header = "\xfa\xbemm"
184
+ script = aux_pow.coinbase_tx.in[0].script
185
+ header_idx = script.index(merged_mining_header)
186
+
187
+ expect(header_idx).to eq(4)
188
+ chain_merkle_root = Bitcoin.mrkl_branch_root(
189
+ aux_pow.chain_branch, block_hash, aux_pow.chain_index
190
+ )
191
+
192
+ # Drop everything up to the merged mining data
193
+ script = script.slice(
194
+ header_idx + merged_mining_header.length, chain_merkle_root.length / 2 + 8
195
+ )
196
+
197
+ tx_root_hash = script.slice(0, chain_merkle_root.length / 2).unpack('H*')[0]
198
+ expect(chain_merkle_root).to eq(tx_root_hash)
199
+
200
+ merkle_branch_size = script.slice(
201
+ chain_merkle_root.length / 2, 4
202
+ ).unpack('V')[0]
203
+ expect(merkle_branch_size).to eq(1 << aux_pow.chain_branch.length)
204
+
205
+ # Choose a pseudo-random slot in the chain merkle tree but have it be fixed
206
+ # for a size/nonce/chain combination.
207
+ nonce = script.slice(chain_merkle_root.length / 2 + 4, 4).unpack('V')[0]
208
+ rand = nonce
209
+ rand = rand * 1_103_515_245 + 12_345
210
+ rand += Bitcoin.network[:auxpow_chain_id]
211
+ rand = rand * 1_103_515_245 + 12_345
212
+
213
+ expect(aux_pow.chain_index).to eq(rand % merkle_branch_size)
214
+ end
215
+ end