Signet
参考リンク
Signetとは
開発者向けに作られたテストネット
普通のテストネットではreorgの発生や、テストマイニングによるブロック生成感覚のばらつきがあるため、開発しにくい場面があった。Lightning Networkの場合はブロック数が重要なので、必要だった。
PoA(Proof of Authority)となっており、ブロックに署名する。中央に管理者を置くことで一定間隔でブロックが生成できるようにした。v21ではマージされている。
Get Started
code:環境構築
$ cd bitcoin
$ ./autogen.sh
$ ./configure
$ make -j5
$ cd bitcoin
$ mkdir signet
$ echo "signet=1
daemon=1" > signet/bitcoin.conf
$ ./bitcoind -datadir=signet
code:動作テスト
$ bitcoin-cli -datadir=signet getconnectioncount
# 0以上の数字(接続数)
$ bitcoin-cli -datadir=signet getblockcount
# 0以上の数字(ブロック数)
faucetからコインを入手する
code:faucet
$ bitcoin-cli -datadir=signet getnewaddress
tb1qvcga0xf58tdfyhgnhng2pmq8qg83heyrlkcy5g
prefixがテストネットと同じ「tb」になっている。「sb」の提案もあったがsignetもテストネットなのでtbにするらしい。
このサイトで上記のアドレスを入力してコインを入手する。
~/bitcoin $bitcoin-cli -datadir=signet listunspent 0
[
{
"txid": "df53d30bf3a9c5badd0de8bf20639e21056e13808e6ffaeb51888cb6920cc861",
"vout": 0,
"address": "tb1qvcga0xf58tdfyhgnhng2pmq8qg83heyrlkcy5g",
"label": "",
"scriptPubKey": "00146611d799343ada925d13bcd0a0ec07020f1be483",
"amount": 0.00100000,
"confirmations": 0,
"spendable": true,
"solvable": true,
"desc": "wpkh(75886ab3/0'/0'/1'02c32bb0c761331b24f9baf0b254a584889dae040ea4edbeb760e2cd3ab8d45766)#awkkushg", "safe": false
}
]
仕様
signetのポートはデフォルトで38332
アドレスのprefixは「tb」
static constexpr uint8_t SIGNET_HEADER4 = {0xec, 0xc7, 0xda, 0xa2}; 4383601fd5
ブロックスクリプトの定義
51 「1」(署名数)
21 0x21 = 33バイト(上記のパブキーの長さ)をプッシュします
THE_REAL_PUBKEY (私たちのパブキー)
51 「1」(パブキー数)
ae OP_CHECKMULTISIG オペコード
script = 51 + 21 + pubkey + 51 + ae
bitcoinでデフォルトで設定されている値
1 of 2 のマルチシグになっている。
公開鍵: 03ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430(33byte)
公開鍵: 0359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c4(33byte)
code:chainparams.cpp
bin = ParseHex("512103ad5e0edad18cb1f0fc0d28a3d4f1f3e445640337489abb10404f2d1e086be430210359ef5021964fe22d6f8e05b2463c9540ce96883fe3b278760f048f5189f2e6c452ae");
vSeeds.emplace_back("178.128.221.177");
vSeeds.emplace_back("2a01:7c8:d005:390::5");
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
カスタムシグネット
ブロック生成の仕組み
Signetのブロック生成はsignetchallengeに入れている公開鍵に対応した秘密鍵を持つ人のみが可能である。
コインベーストランザクションを作成するとき以下のようなフォーマットで作成する必要がある。
code:to_spend
nVersion = 0
nLockTime = 0
vin 0 .prevout.hash = 0000 ... 000 vin 0 .prevout.n = 0xFFFFFFFF vin 0 .scriptWitness = [] vout 0 .scriptPubKey = signet_challenge vout0のscriptPubkeyにはsignet_challengeを入れる必要があり、これに対して有効な署名データを作成出来るもののみが、ブロックの生成が可能となる。
block_dataは、ブロックのnVersion、hashPrevBlock、signet_merkle_root、およびnTimeのシリアル化が入る。
ブロック生成時、コインベースをインプットとしたOP_RETURNのトランザクションを作成する必要がある。
code:to_sign
nVersion = 0
nLockTime = 0
vin 0 .prevout.hash = to_spend.txid vout 0 .scriptPubKey = OP_RETURN