Guest User

Untitled

a guest
Dec 15th, 2018
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.56 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # This code to implement p2sh-multisig example as worked through at
  4. # https://bitcoin.org/en/developer-examples#p2sh-multisig
  5. #
  6. echo "[Setting up run ...]"
  7. DEBUG=true
  8. USE_REGTEST=false # If false, use testnet
  9. ADDRESS_TYPE="p2sh-segwit"
  10. BITCOIND_HOMEDIR="/home/bitcoind"
  11. BITCOIND_CONFDIR=$BITCOIND_HOMEDIR"/.bitcoin"
  12. if [[ "$USE_REGTEST" = "true" ]]
  13. then
  14. AMOUNT0="49.99900000"
  15. AMOUNT1="10.00000000" # Differs from example to forestall float and rounding issues
  16. AMOUNT2="9.99800000"
  17. REGTEST_PARAM="-regtest"
  18. REGTEST_DIR=$BITCOIND_CONFDIR"/regtest"
  19. BITCOIND_CONFFILE=$BITCOIND_CONFDIR"/regtest.conf"
  20. TEST_SPEND_FROM_NONCOINBASE=true # Test if it matters that funds were generational
  21. else
  22. AMOUNT0="49.99900000" # Unused on testnet
  23. AMOUNT1="0.00030001"
  24. AMOUNT2="0.00015001"
  25. REGTEST_PARAM=""
  26. REGTEST_DIR="/dev/null"
  27. BITCOIND_CONFFILE=$BITCOIND_CONFDIR"/testnet.conf"
  28. TEST_SPEND_FROM_NONCOINBASE=false
  29. fi
  30. TXFEE="0.00013000"
  31. BITCOIN_CLI="/usr/local/bin/bitcoin-cli -conf="$BITCOIND_CONFFILE" "$REGTEST_PARAM
  32. BITCOIN_DAEMON="/usr/local/bin/bitcoind -conf="$BITCOIND_CONFFILE" "$REGTEST_PARAM" -daemon"
  33. TEST_PUBLIC_KEYS_ONLY=true # Public keys vs Addresses test
  34.  
  35. #
  36. # Get regtest network back to a known state: stop if going, unlink regtest directories,
  37. # restart, and generate first 101 blocks to get 50btc in funds. Give a short period
  38. # to allow cleaning up etc. The 101 is important as it limits our balance to 50btc
  39. if [[ "$USE_REGTEST" = "true" ]]
  40. then
  41. $BITCOIN_CLI stop
  42. sleep 1
  43. rm -rf $REGTEST_DIR && $BITCOIN_DAEMON
  44. sleep 2
  45. $BITCOIN_CLI generate 101 >/dev/null
  46. fi
  47.  
  48. #
  49. # I see references such as at https://github.com/bitcoin/bitcoin/issues/7277
  50. # that one cannot send funds from coinbase to p2sh addresses over regtest.
  51. # This code to send almost whole balance over such that a later spend to
  52. # fund p2sh address cannot but come from a non-coinbase address
  53. # Ignored on testnet
  54. if [[ "$TEST_SPEND_FROM_NONCOINBASE" = "true" ]]
  55. then
  56. NONCOINBASE_ADDRESS=`$BITCOIN_CLI getnewaddress $ADDRESS_TYPE`
  57. TXID=`$BITCOIN_CLI sendtoaddress $NONCOINBASE_ADDRESS $AMOUNT0`
  58. if $DEBUG
  59. then
  60. echo "Sending coinbase funds to new key"
  61. echo "[NONCOINBASE_ADDRESS]: "$NONCOINBASE_ADDRESS
  62. echo "[TXID ]: "$TXID
  63. echo "-----"
  64. fi
  65. fi
  66.  
  67. echo "[...Create and fund a 2-of-3 multisig transaction...]"
  68. #
  69. # Create the addresses we will use
  70. NEW_ADDRESS1=`$BITCOIN_CLI getnewaddress $ADDRESS_TYPE`
  71. NEW_ADDRESS2=`$BITCOIN_CLI getnewaddress $ADDRESS_TYPE`
  72. NEW_ADDRESS3=`$BITCOIN_CLI getnewaddress $ADDRESS_TYPE`
  73. if [[ "$DEBUG" = "true" ]]
  74. then
  75. # Example says addresses start with m, this code sees them start
  76. # with 2. Problem?
  77. echo "Creating new addresses:"
  78. echo "[NEW_ADDRESS1]: "$NEW_ADDRESS1
  79. echo "[NEW_ADDRESS2]: "$NEW_ADDRESS2
  80. echo "[NEW_ADDRESS3]: "$NEW_ADDRESS3
  81. echo "-----"
  82. fi
  83.  
  84. #
  85. # Obtain one public key - not sure why. To prove we can
  86. # use either address or public key to create the
  87. # multisigaddress? To show how to obtain the data for
  88. # passing on to others? ("all of which will be converted
  89. # to public keys in the redeem script.")
  90. # NB: validateaddress in example superceded by getaddressinfo
  91. if [[ "$TEST_PUBLIC_KEYS_ONLY" = "true" ]]
  92. then
  93. RV=`$BITCOIN_CLI getaddressinfo $NEW_ADDRESS1`
  94. NEW_ADDRESS1_PUBLIC_KEY=`echo $RV | sed 's/^.*"pubkey": "//' |
  95. sed 's/".*$//'` # Checked
  96. RV=`$BITCOIN_CLI getaddressinfo $NEW_ADDRESS2`
  97. NEW_ADDRESS2_PUBLIC_KEY=`echo $RV | sed 's/^.*"pubkey": "//' |
  98. sed 's/".*$//'` # Checked
  99. fi
  100. RV=`$BITCOIN_CLI getaddressinfo $NEW_ADDRESS3`
  101. NEW_ADDRESS3_PUBLIC_KEY=`echo $RV | sed 's/^.*"pubkey": "//' |
  102. sed 's/".*$//'` # Checked
  103. if [[ "$DEBUG" = "true" ]]
  104. then
  105. echo "Obtain public key per address:"
  106. if [[ "$TEST_PUBLIC_KEYS_ONLY" = "true" ]]
  107. then
  108. echo "[NEW_ADDRESS1_PUBLIC_KEY]: "$NEW_ADDRESS1_PUBLIC_KEY
  109. echo "[NEW_ADDRESS2_PUBLIC_KEY]: "$NEW_ADDRESS2_PUBLIC_KEY
  110. fi
  111. echo "[NEW_ADDRESS3_PUBLIC_KEY]: "$NEW_ADDRESS3_PUBLIC_KEY
  112. echo "-----"
  113. fi
  114.  
  115. #
  116. # Obtain the address and redeem script needed to obtain the funds.
  117. # NB: createmultisig in example superceded by addmultisigaddress
  118. if [[ "$TEST_PUBLIC_KEYS_ONLY" = "true" ]]
  119. then
  120. RV=`$BITCOIN_CLI addmultisigaddress 2 '''
  121. [
  122. "'$NEW_ADDRESS1_PUBLIC_KEY'",
  123. "'$NEW_ADDRESS2_PUBLIC_KEY'",
  124. "'$NEW_ADDRESS3_PUBLIC_KEY'"
  125. ]'''`
  126. else
  127. RV=`$BITCOIN_CLI addmultisigaddress 2 '''
  128. [
  129. "'$NEW_ADDRESS1'",
  130. "'$NEW_ADDRESS2'",
  131. "'$NEW_ADDRESS3_PUBLIC_KEY'"
  132. ]'''`
  133. fi
  134. P2SH_ADDRESS=`echo $RV | sed 's/^.*"address": "//' |
  135. sed 's/".*$//'` # Checked
  136. P2SH_REDEEM_SCRIPT=`echo $RV | sed 's/^.*"redeemScript": "//' |
  137. sed 's/".*$//'` # Checked
  138. if [[ "$DEBUG" = "true" ]]
  139. then
  140. echo "Obtain p2sh address and redeemScript:"
  141. echo "[P2SH_ADDRESS ]: "$P2SH_ADDRESS
  142. echo "[P2SH_REDEEM_SCRIPT]: "$P2SH_REDEEM_SCRIPT
  143. echo "-----"
  144. fi
  145.  
  146. #
  147. # On regtest, send funds from the first 50btc block we can spend
  148. # to the p2sh_address determined above.
  149. # On testnet, send part of our balance
  150. if [[ "$USE_REGTEST" != "true" ]]
  151. then
  152. RV=`$BITCOIN_CLI settxfee $TXFEE`
  153. fi
  154. UTXO_TXID=`$BITCOIN_CLI sendtoaddress $P2SH_ADDRESS $AMOUNT1`
  155. if [[ "$DEBUG" = "true" ]]
  156. then
  157. echo "Fund p2sh address"
  158. echo "[UTXO_TXID]: "$UTXO_TXID
  159. echo "-----"
  160. fi
  161.  
  162. #
  163. # Get everything thus far into a block
  164. # $BITCOIN_CLI generate 1 >/dev/null
  165.  
  166. #
  167. #
  168.  
  169. echo "[...Redeem the 2-of-3 transaction]"
  170. #
  171. # Obtain details about the funded transaction. We want whichever output
  172. # was the 10btc output even though the example suggests there is only
  173. # one output.
  174. # NB: second parameter in example superceded after v0.14.0
  175. RV=`$BITCOIN_CLI getrawtransaction $UTXO_TXID true`
  176. UTXO2_VALUE=`echo $RV | sed 's/^.*"value": //' | sed 's/,.*$//'` # Checked
  177. UTXO2_VOUT=`echo $RV | sed 's/^.*"n": //' | sed 's/,.*$//'` # Checked
  178. UTXO2_OUTPUT_SCRIPT=`echo $RV | sed 's/^.*"scriptPubKey"//' | sed 's/"reqSigs".*$//' |
  179. sed 's/^.*"hex": "//' | sed 's/".*$//'` # Checked
  180. UTXO1_VALUE=`echo $RV | sed 's/"addresses":.*//' | sed 's/^.*"value": //' |
  181. sed 's/,.*$//'` # Checked
  182. UTXO1_VOUT=`echo $RV | sed 's/"addresses":.*//' | sed 's/^.*"n": //' |
  183. sed 's/,.*$//'` # Checked
  184. UTXO1_OUTPUT_SCRIPT=`echo $RV | sed 's/"addresses":.*//' | sed 's/^.*"scriptPubKey"//' |
  185. sed 's/"reqSigs".*$//' | sed 's/^.*"hex": "//' |
  186. sed 's/".*$//'` # Checked
  187. if [[ "$UTXO1_VALUE" = "$AMOUNT1" ]]
  188. then
  189. # Use first output (change is the second output)
  190. UTXO_VOUT=$UTXO1_VOUT
  191. UTXO_OUTPUT_SCRIPT=$UTXO1_OUTPUT_SCRIPT
  192. else
  193. # Use second output (changes was the first output)
  194. UTXO_VOUT=$UTXO2_VOUT
  195. UTXO_OUTPUT_SCRIPT=$UTXO2_OUTPUT_SCRIPT
  196. fi
  197. if [[ "$DEBUG" = "true" ]]
  198. then
  199. echo "Capture which outputs we'll use:"
  200. echo "[1 VALUE ]: "$UTXO1_VALUE
  201. echo "[1 VOUT ]: "$UTXO1_VOUT
  202. echo "[1 OUTPUT_SCRIPT ]: "$UTXO1_OUTPUT_SCRIPT
  203. echo "[2 VALUE ]: "$UTXO2_VALUE
  204. echo "[2 VOUT ]: "$UTXO2_VOUT
  205. echo "[2 OUTPUT_SCRIPT ]: "$UTXO2_OUTPUT_SCRIPT
  206. echo "Vout and Output script chosen:"
  207. echo "[UTXO_VOUT ]: "$UTXO_VOUT
  208. echo "[UTXO_OUTPUT_SCRIPT ]: "$UTXO_OUTPUT_SCRIPT
  209. echo "-----"
  210. fi
  211.  
  212. #
  213. # Now create the address redeemed to
  214. NEW_ADDRESS4=`$BITCOIN_CLI getnewaddress $ADDRESS_TYPE`
  215. if [[ "$DEBUG" = "true" ]]
  216. then
  217. echo "Create redeem-to address:"
  218. echo "[NEW_ADDRESS4]: "$NEW_ADDRESS4
  219. echo "-----"
  220. fi
  221.  
  222. #
  223. # Create a new transaction, slightly less value to accomodate mining fee
  224. RAW_TX=`$BITCOIN_CLI createrawtransaction '''
  225. [
  226. {
  227. "txid": "'$UTXO_TXID'",
  228. "vout": '$UTXO_VOUT'
  229. }
  230. ]
  231. ''' '''
  232. {
  233. "'$NEW_ADDRESS4'": '$AMOUNT2'
  234. }'''`
  235. RAW_TX_SZ=${#RAW_TX}
  236. if [[ "$DEBUG" = "true" ]]
  237. then
  238. echo "Generate unsigned transaction:"
  239. echo "[RAW_TX]: "$RAW_TX
  240. echo "-----"
  241. fi
  242.  
  243. #
  244. # Get 2 of the 3 private keys
  245. NEW_ADDRESS1_PRIVATE_KEY=`$BITCOIN_CLI dumpprivkey $NEW_ADDRESS1`
  246. NEW_ADDRESS3_PRIVATE_KEY=`$BITCOIN_CLI dumpprivkey $NEW_ADDRESS3`
  247. if [[ "$DEBUG" = "true" ]]
  248. then
  249. echo "Capture private keys for use in signing:"
  250. echo "[NEW_ADDRESS1_PRIVATE_KEY]: "$NEW_ADDRESS1_PRIVATE_KEY
  251. echo "[NEW_ADDRESS3_PRIVATE_KEY]: "$NEW_ADDRESS3_PRIVATE_KEY
  252. echo "-----"
  253. fi
  254.  
  255. #
  256. # 1 of 3 sign off the transaction
  257. # NB: signrawtransaction in example superceded by signrawtransactionwithkey
  258. # NB: order of parameters reverse, and amount becomes mandatory
  259. RV=`$BITCOIN_CLI signrawtransactionwithkey $RAW_TX '''
  260. [
  261. "'$NEW_ADDRESS1_PRIVATE_KEY'"
  262. ]
  263. ''' '''
  264. [
  265. {
  266. "txid": "'$UTXO_TXID'",
  267. "vout": '$UTXO_VOUT',
  268. "scriptPubKey": "'$UTXO_OUTPUT_SCRIPT'",
  269. "redeemScript": "'$P2SH_REDEEM_SCRIPT'",
  270. "amount": '$AMOUNT2'
  271. }
  272. ]'''`
  273. PARTLY_SIGNED_RAW_TX=`echo $RV | sed 's/^.*"hex": "//' | sed 's/".*//'`
  274. PARTLY_SIGNED_RAW_TX_SZ=${#PARTLY_SIGNED_RAW_TX}
  275. if [[ $PARTLY_SIGNED_RAW_TX_SZ -eq $RAW_TX_SZ ]]
  276. then
  277. echo "Transaction didn't change size at PARTLY_SIGNED_RAW_TX_SZ. Eh?"
  278. exit
  279. fi
  280. if [[ $PARTLY_SIGNED_RAW_TX_SZ -eq 0 ]]
  281. then
  282. echo "Failed at PARTLY_SIGNED_RAW_TX"
  283. echo "Response: "
  284. echo "[RAW_TX ]: "$RAW_TX
  285. echo "[UTXO_TXID ]: "$UTXO_TXID
  286. echo "[UTXO_VOUT ]: "$UTXO_VOUT
  287. echo "[UTXO_OUTPUT_SCRIPT ]: "$UTXO_OUTPUT_SCRIPT
  288. echo "[P2SH_REDEEM_SCRIPT ]: "$P2SH_REDEEM_SCRIPT
  289. echo "[NEW_ADDRESS1_PRIVATE_KEY]: "$NEW_ADDRESS1_PRIVATE_KEY
  290. exit
  291. fi
  292. if [[ "$DEBUG" = "true" ]]
  293. then
  294. echo "Transaction after first signature:"
  295. echo "[PARTLY_SIGNED_RAW_TX ]: "$PARTLY_SIGNED_RAW_TX
  296. echo "-----"
  297. fi
  298.  
  299. #
  300. # 2 of 3 signs off the transaction
  301. RV=`$BITCOIN_CLI signrawtransactionwithkey $PARTLY_SIGNED_RAW_TX '''
  302. [
  303. "'$NEW_ADDRESS3_PRIVATE_KEY'"
  304. ]
  305. ''' '''
  306. [
  307. {
  308. "txid": "'$UTXO_TXID'",
  309. "vout": '$UTXO_VOUT',
  310. "scriptPubKey": "'$UTXO_OUTPUT_SCRIPT'",
  311. "redeemScript": "'$P2SH_REDEEM_SCRIPT'",
  312. "amount": '$AMOUNT2'
  313. }
  314. ]'''`
  315. SIGNED_RAW_TX=`echo $RV | sed 's/^.*"hex": "//' | sed 's/".*//'` # Checked
  316. SIGNED_RAW_TX_SZ=${#SIGNED_RAW_TX}
  317. COMPLETE=`echo $RV | sed 's/^.*"complete": //' | sed 's/W.*//'` # Checked
  318. if [[ "$COMPLETE" != "true" ]]
  319. then
  320. echo "Second signature did not lead to completed transaction. Eh?"
  321. echo $RV
  322. exit
  323. fi
  324. if [[ "$DEBUG" = "true" ]]
  325. then
  326. echo "Transaction after second signature:"
  327. echo "[SIGNED_RAW_TX]: "$SIGNED_RAW_TX
  328. echo "-----"
  329. fi
  330.  
  331. #
  332. # And now broadcast it
  333. TXID=`$BITCOIN_CLI sendrawtransaction $SIGNED_RAW_TX`
  334. if [[ ${#TXID} -eq 0 ]]
  335. then
  336. echo "Broadcast has gone wrong. Eh?"
  337. fi
  338. if [[ "$DEBUG" = "true" ]]
  339. then
  340. echo "TXID from broadcasting:"
  341. echo "[TXID]: "$TXID
  342. echo "-----"
  343. fi
  344.  
  345. $ ./p2sh-multisig.sh
  346. [Setting up run ...]
  347. [...Create and fund a 2-of-3 multisig transaction...]
  348. Creating new addresses:
  349. [NEW_ADDRESS1]: 2NAWwgmSnPcXFshHX41ewLHaN4nYLTzEdHn
  350. [NEW_ADDRESS2]: 2NAoFjMziphkxULu7p4dtcBKLXicnvvcX53
  351. [NEW_ADDRESS3]: 2Mu3S24XuasYheQsinhKAabDnGnH6eakm2X
  352. -----
  353. Obtain public key per address:
  354. [NEW_ADDRESS1_PUBLIC_KEY]: 036ef3ee62456676a49b3087df3f0d804eb09bfcfa95ca606465bee5cfeab4da98
  355. [NEW_ADDRESS2_PUBLIC_KEY]: 0386518595790f10fa1915bb119a0b41d96a380eeb3f3a76ae0694acc9fd2fb333
  356. [NEW_ADDRESS3_PUBLIC_KEY]: 0371d090dd98316a9f8f63c1d925b42cf157f265d1eff84b65620629914b43019c
  357. -----
  358. Obtain p2sh address and redeemScript:
  359. [P2SH_ADDRESS ]: 2N3G8rhzkMBmfRp54A4rfpW5jTcd65m7hCs
  360. [P2SH_REDEEM_SCRIPT]: 5221036ef3ee62456676a49b3087df3f0d804eb09bfcfa95ca606465bee5cfeab4da98210386518595790f10fa1915bb119a0b41d96a380eeb3f3a76ae0694acc9fd2fb333210371d090dd98316a9f8f63c1d925b42cf157f265d1eff84b65620629914b43019c53ae
  361. -----
  362. Fund p2sh address
  363. [UTXO_TXID]: 06c7e967e0d5f53899a02137d3a1d4dc0eee53690d20d403242954caa187c721
  364. -----
  365. [...Redeem the 2-of-3 transaction]
  366. Capture which outputs we'll use:
  367. [1 VALUE ]: 0.00030001
  368. [1 VOUT ]: 0
  369. [1 OUTPUT_SCRIPT ]: a9146ddd64168434e4e7cf8f7a2a2b485fa1fc8f987e87
  370. [2 VALUE ]: 0.00005412
  371. [2 VOUT ]: 1
  372. [2 OUTPUT_SCRIPT ]: a9146ecbcb78f6ab60ebe53cc69532407a32973af9aa87
  373. Vout and Output script chosen:
  374. [UTXO_VOUT ]: 0
  375. [UTXO_OUTPUT_SCRIPT ]: a9146ddd64168434e4e7cf8f7a2a2b485fa1fc8f987e87
  376. -----
  377. Create redeem-to address:
  378. [NEW_ADDRESS4]: 2MyuteHEFmxvG2rX8r817DTKhqj8f2ncsmt
  379. -----
  380. Generate unsigned transaction:
  381. [RAW_TX]: 020000000121c787a1ca54292403d4200d6953ee0edcd4a1d33721a09938f5d5e067e9c7060000000000ffffffff01993a00000000000017a9144920d433d073267b904ae23df3b15ea47aec95038700000000
  382. -----
  383. Capture private keys for use in signing:
  384. [NEW_ADDRESS1_PRIVATE_KEY]: cVT8F8PGF9HJSeBgQir5ZHj5Ng4upSPAJHyVnk2puYw6Zs5GdbyR
  385. [NEW_ADDRESS3_PRIVATE_KEY]: cSakmVL2kdR5jTukCFNBPCifcmg3jjQ6eGEvtagnsAoSdDWcu4fT
  386. -----
  387. Transaction after first signature:
  388. [PARTLY_SIGNED_RAW_TX ]: 0200000000010121c787a1ca54292403d4200d6953ee0edcd4a1d33721a09938f5d5e067e9c70600000000232200205d577278a6dfefffaa4e04ef23fd1172e923f9e7b4949f991b3d7f2af89abb83ffffffff01993a00000000000017a9144920d433d073267b904ae23df3b15ea47aec950387040047304402202c9946f1d50a974f3b7cf24a99002f3f3ca18af7b54939bf2ec1acf6f5528b07022029aaa63fde914735b8e92c202ce3d4b02ea8ded1d2b47821670dd3c6d8dcb02b0100695221036ef3ee62456676a49b3087df3f0d804eb09bfcfa95ca606465bee5cfeab4da98210386518595790f10fa1915bb119a0b41d96a380eeb3f3a76ae0694acc9fd2fb333210371d090dd98316a9f8f63c1d925b42cf157f265d1eff84b65620629914b43019c53ae00000000
  389. -----
  390. Transaction after second signature:
  391. [SIGNED_RAW_TX]: 0200000000010121c787a1ca54292403d4200d6953ee0edcd4a1d33721a09938f5d5e067e9c70600000000232200205d577278a6dfefffaa4e04ef23fd1172e923f9e7b4949f991b3d7f2af89abb83ffffffff01993a00000000000017a9144920d433d073267b904ae23df3b15ea47aec950387040047304402202c9946f1d50a974f3b7cf24a99002f3f3ca18af7b54939bf2ec1acf6f5528b07022029aaa63fde914735b8e92c202ce3d4b02ea8ded1d2b47821670dd3c6d8dcb02b0147304402201e5e933e674f7e4597c1066b48cdb4ca1c7382235b53d411608c2e3a22a31df7022022fc673d696987146effcbb9ce43265ab9ee19da05eaef0bb35ced729fe9592501695221036ef3ee62456676a49b3087df3f0d804eb09bfcfa95ca606465bee5cfeab4da98210386518595790f10fa1915bb119a0b41d96a380eeb3f3a76ae0694acc9fd2fb333210371d090dd98316a9f8f63c1d925b42cf157f265d1eff84b65620629914b43019c53ae00000000
  392. -----
  393. error code: -26
  394. error message:
  395. non-mandatory-script-verify-flag (Signature must be zero for failed CHECK(MULTI)SIG operation) (code 64)
  396. Broadcast has gone wrong. Eh?
  397. TXID from broadcasting:
  398. [TXID]:
  399. -----
  400. $
  401.  
  402. $ cat regtest.conf
  403. regtest=1
  404. server=1
  405. rpcuser=xxx
  406. rpcpassword=xxx
  407. rpcallowip=127.0.0.1
  408. deprecatedrpc=createmultisig
  409. deprecatedrpc=generate
  410. debug=1
  411. [regtest]
  412. rpcport=18443
  413.  
  414. $ cat testnet.conf
  415. testnet=1
  416. server=1
  417. rpcuser=xxx
  418. rpcpassword=xxx
  419. rpcallowip=127.0.0.1
  420. rpcport=18332
Add Comment
Please, Sign In to add comment