Taproot
Taprootは11月からビットコインメインネットにてアクティベートされる予定の新しいアウトプット(と、アウトプットを消費するためのスクリプトルール)です。
今回はBitcoinのリファレンス実装であるbitcoindを使ってTaprootのアドレス(P2TRアドレス)を作成し、そのアドレスへの入金・アドレスからの出金トランザクションを作ってみようと思います。全てTestnet(Testnet3)から行います。
taprootに関連するBIPには例えば以下があります。
BIP340 Schnorr Signatures for secp256k1
BIP341 Taproot: SegWit version 1 spending rules
BIP342 Validation of Taproot Scripts
今回はこちらの記事を参考にしました。
https://bitcoinops.org/ja/newsletters/2021/09/22/#taproot%E3%81%AE%E6%BA%96%E5%82%99-14-signet%E3%81%A7%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88
Taprootの安全性に関する証明の解説記事も近日公開予定です。
https://tech.hashport.io/2356/
P2TRアドレス
P2TRのアドレスはbase58ではなくbech32mによってエンコードされます。そのため通常のwalletを作成し、
$ bitcoin-cli getnewaddress "" bech32m
とするだけでは(現状)作れません。
bech32mはbech32の問題を回避するために計算方法の一部を変更したものです。
詳しくはBIP 350 Bech32m format for v1+ witness addressesを参照してください。
descriptor wallet
Taproot対応機能を有効化するためにはwalletがTaprootで表されたscriptを解釈できるようにする必要があります。
そのためにOutput descriptorの設定が必要です。
descriptorについて詳しくは https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md を参照してください。
PRのbuild
今回はdescriptorを自前で作成するのではなく、descriptorのデフォルトをtr(...)に変更してあるPRを使って検証を行います。
ドキュメントを参考にbuildしてみてください。
うまくいっていれば
$ bitcoind -version
Bitcoin Core version v22.99.0-5f89682ccd2f
のように表示されるはずです。
アドレスの作成
ここまでの準備が整ったら、実際にアドレスを作成します。
descriptorを有効にしたwalletを作成し、アドレスを作ります。
$ bitcoind -testnet -daemon
$ bitcoin-cli -testnet -named createwallet wallet_name=p4tr descriptors=true
{
"name": "p4tr",
"warning": "Wallet is an experimental descriptor wallet"
}
testnet -named getnewaddress address_type=bech32m
tb1pmgyn2zzdc7579glaruqp3ar4rcgz3sp6g8tnz5rs73afzl8pcpuqc93tky
$ bitcoin-cli -testnet -named getwalletinfo
{
"walletname": "p4tr",
"walletversion": 169900,
"format": "sqlite",
"balance": 0.00000000,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 0,
"keypoolsize": 3999,
"keypoolsize_hd_internal": 4000,
"paytxfee": 0.00000000,
"private_keys_enabled": true,
"avoid_reuse": false,
"scanning": false,
"descriptors": true
}
$ bitcoin-cli -testnet listdescriptors
{
:
{
"desc": "tr([679bc6f1/86'/1'/0']tpubDCJbjZn3162KFQ7HHvtsdoEtkv2ZsnqnCcfT2ynvj29pKM1rF2EVLFfVj56ixJzYoZYUaVLqyrJ8hiJZLmF22JvDg64dGS3bQeiKwH1DgCN/0/*)#gvphrnz6",
"timestamp": 1633931616,
"active": true,
"internal": false,
"range": [
0,
999
],
"next": 1
},
:
}
ここでうまくいっていれば必ずtb1pから開始しています。
P2TRアドレスへの入金
Testnetで資金を調達するにはfaucetを利用します。しかし、執筆時点では直接P2TRのアドレスに入金できるfaucetがないのでP2TRへの出金に対応しているウォレット(今回はelectrum)を介します。
下記のようなトランザクションが得られました。
$ bitcoin-cli -testnet -named gettransaction txid=852d3b7913606222a605f09c26f170894728d27af0bc94231ecd78a1c2e106a0 verbose=true
{
"amount": 0.01000000,
"confirmations": 19,
"blockhash": "00000000f7696cc4ac4f1e63fd01cbecc2f9ababf512eca6dd14792f3bb4634d",
"blockheight": 2098597,
"blockindex": 47,
"blocktime": 1633933026,
"txid": "852d3b7913606222a605f09c26f170894728d27af0bc94231ecd78a1c2e106a0",
"walletconflicts": [
],
"time": 1633933026,
"timereceived": 1633937296,
"bip125-replaceable": "no",
"details": [
{
"address": "tb1pmgyn2zzdc7579glaruqp3ar4rcgz3sp6g8tnz5rs73afzl8pcpuqc93tky",
"category": "receive",
"amount": 0.01000000,
"label": "",
"vout": 0
}
],
"hex": "02000000000101351ead658754afa2fa5fa77883ec508886d10eba78c40c1cb2e691e6a412654f0100000000fdffffff0240420f0000000000225120da0935084dc7a9e2a3fd1f0018f4751e1028c03a41d7315070f47a917ce1c07894b1a50000000000160014cc68d7349a908fd92892104506a924f3cb3f50380247304402201b2a0230dce26a6120d3b8dda8b2408941d770c6e6179ee35b867186c0fff18402200e797cceb788348382205ba610a833d5d5b68b4f342124e15a59890dbf3d467e012102db47756910bb44fe732078f96d73312f7bf4fd365e1306bd632ed7d27f613895a4052000",
"decoded": {
"txid": "852d3b7913606222a605f09c26f170894728d27af0bc94231ecd78a1c2e106a0",
"hash": "969cc31bf73f515938121ef23d02fae7a122d2a19298a95852d06378c7d55c8a",
"version": 2,
"size": 234,
"vsize": 153,
"weight": 609,
"locktime": 2098596,
"vin": [
{
"txid": "4f6512a4e691e6b21c0cc478ba0ed1868850ec8378a75ffaa2af548765ad1e35",
"vout": 1,
"scriptSig": {
"asm": "",
"hex": ""
},
"txinwitness": [
"304402201b2a0230dce26a6120d3b8dda8b2408941d770c6e6179ee35b867186c0fff18402200e797cceb788348382205ba610a833d5d5b68b4f342124e15a59890dbf3d467e01",
"02db47756910bb44fe732078f96d73312f7bf4fd365e1306bd632ed7d27f613895"
],
"sequence": 4294967293
}
],
"vout": [
{
"value": 0.01000000,
"n": 0,
"scriptPubKey": {
"asm": "1 da0935084dc7a9e2a3fd1f0018f4751e1028c03a41d7315070f47a917ce1c078",
"hex": "5120da0935084dc7a9e2a3fd1f0018f4751e1028c03a41d7315070f47a917ce1c078",
"address": "tb1pmgyn2zzdc7579glaruqp3ar4rcgz3sp6g8tnz5rs73afzl8pcpuqc93tky",
"type": "witness_v1_taproot"
}
},
{
"value": 0.10858900,
"n": 1,
"scriptPubKey": {
"asm": "0 cc68d7349a908fd92892104506a924f3cb3f5038",
"hex": "0014cc68d7349a908fd92892104506a924f3cb3f5038",
"address": "tb1qe35dwdy6jz8aj2yjzpzsd2fy709n75pc0jcnfu",
"type": "witness_v0_keyhash"
}
}
]
}
}
P2TRアドレスからの出金
上記で得られたUTXOを使って送金を行ってみます。
$ bitcoin-cli -testnet -named sendtoaddress address="2N8XFqcwMjNRpWyydk2yfLaBrpbCYRiDazm" amount=0.001
b7a7d8e6c8f86981e7668e8565c68842a979a7c6f7ead2ee00f2c258d1d6def7
$bitcoin-cli -testnet -named getrawtransaction txid=b7a7d8e6c8f86981e7668e8565c68842a979a7c6f7ead2ee00f2c258d1d6def7 verbose=true
{
"txid": "b7a7d8e6c8f86981e7668e8565c68842a979a7c6f7ead2ee00f2c258d1d6def7",
"hash": "dae41641676664fc7cfdc5a651f91d8c8dcae1ae848bec99343ef71e5a9327ca",
"version": 2,
"size": 182,
"vsize": 131,
"weight": 524,
"locktime": 2098607,
"vin": [
{
"txid": "852d3b7913606222a605f09c26f170894728d27af0bc94231ecd78a1c2e106a0",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"txinwitness": [
"2d985e72c78a375109db32dd11ae7c8a09065739a974f2b7992572ff8d88c63018d3bb097795c497e9e4ce377b18b56dccd485b821e51d5156c0f036007431d7"
],
"sequence": 4294967294
}
],
"vout": [
{
"value": 0.00899869,
"n": 0,
"scriptPubKey": {
"asm": "0 a8ec1d15badb1636940b81083e38384c3f498d25",
"hex": "0014a8ec1d15badb1636940b81083e38384c3f498d25",
"address": "tb1q4rkp69d6mvtrd9qtsyyruwpcfsl5nrf9lnxjlx",
"type": "witness_v0_keyhash"
}
},
{
"value": 0.00100000,
"n": 1,
"scriptPubKey": {
"asm": "OP_HASH160 a7921643d33c098c8ef7fc5a876fb6dee4facbe7 OP_EQUAL",
"hex": "a914a7921643d33c098c8ef7fc5a876fb6dee4facbe787",
"address": "2N8XFqcwMjNRpWyydk2yfLaBrpbCYRiDazm",
"type": "scripthash"
}
}
],
"hex": "02000000000101a006e1c2a178cd1e2394bcf07ad228478970f1269cf005a622626013793b2d850000000000feffffff021dbb0d0000000000160014a8ec1d15badb1636940b81083e38384c3f498d25a08601000000000017a914a7921643d33c098c8ef7fc5a876fb6dee4facbe78701402d985e72c78a375109db32dd11ae7c8a09065739a974f2b7992572ff8d88c63018d3bb097795c497e9e4ce377b18b56dccd485b821e51d5156c0f036007431d7af052000"
}
$ bitcoin-cli -testnet getwalletinfo
{
"walletname": "p4tr",
"walletversion": 169900,
"format": "sqlite",
"balance": 0.00899869,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 2,
"keypoolsize": 4000,
"keypoolsize_hd_internal": 4000,
"paytxfee": 0.00001000,
"private_keys_enabled": true,
"avoid_reuse": false,
"scanning": false,
"descriptors": true
}
まとめ
2021年11月に予定されているブロック709632よりTaprootがmainnetでも正式にアクティベートされます。今回は検証も兼ねてP2TRによる入出金をテストしました。
今回の実験で使用した各アドレス・トランザクションは以下で閲覧できます。