Testnet3でTaprootのトランザクションを作ってみる

Testnet3でTaprootトランザクション作ってみた お知らせ
Table of Contents

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による入出金をテストしました。
今回の実験で使用した各アドレス・トランザクションは以下で閲覧できます。

Address: tb1pmgyn2zzdc7579glaruqp3ar4rcgz3sp6g8tnz5rs73afzl8pcpuqc93tky
The most popular and trusted block explorer and crypto transaction search engine.
https://blockstream.info/testnet/address/tb1pmgyn2zzdc7579glaruqp3ar4rcgz3sp6g8tnz5rs73afzl8pcpuqdep8nx

参考

Bitcoin Optech Newsletter #167
今週のニュースレターでは、BIPプロセスの変更案と、 Bitcoin Coreにパッケージリレーのサポートを追加するための計画の要約、 DNSにLNノードの情報を追加することについての議論のリンクを掲載しています。 また、サービスやクライアントソフトウェアの変更点や、Taprootへの準備方法、新しいリリースとリリース...
How to make a taproot transaction with bitcoin-cli?
Can you give a simple step-by-step example for a taproot transaction with bitcoin-cli on Testnet?
How can I spend from a P2TR address on Signet with the Bitcoin Core wallet in 22.0?
Apparently (credit 0xB10C) there are only 20 key-path and 5 script-path spends of P2TR outputs on the Signet blockchain today (July 7th 2021). How can I increas...
Creating a regtest taproot descriptor wallet with bitcoind
Creating a regtest taproot descriptor wallet with bitcoind - tr_wallet_test.md
タイトルとURLをコピーしました