btc: JSON-RPC では by-name も OK
2025/02/25
bitcoin-cli
はコマンドによって引数が違う。
複数の引数がある際、省略して良いものと良くないものが混在している。
例えば sendtoaddress
(v28.1)は 11個の引数を取ることができる。
宛先アドレスと送金額だけ指定するなら引数を 2つ書けば良いのだが、
feerate を指定しようと思ったら 10番目の引数なのでその間をデフォルト値を調べて埋めていた。
$ bitcon-cli sendtoaddress $addr 0.01 "" "" false true 1 "unset" true 1
それが最近(でもないのだが) -named
というオプションが増えた。
順番に列挙する形ではなく、引数の名前を使うようにする。
$ bitcon-cli -named sendtoaddress address=$addr amount=0.1 fee_rate=1
bitcoin-cli
はよいけど JSON-RPC で制御する分には関係ないと思っていたのだが、
ブログを書いていたので tcpdump
を使って -named
のときに bitcoin-cli
が送信しているデータを確認した。
そうすると、params
が []
ではなく {}
で JSON の key-value を送信しているではないか!
ならば curl
などでもできるはず・・・できた。
$ curl --user user:pass --data-binary '{"jsonrpc": "2.0", "id": "curltest", "method": "sendtoaddress", "params": {"address":"$addr", "amount": 0.001, "fee_rate": 1 }}' -H 'content-type: application/json' http://127.0.0.1:18443/
{"jsonrpc":"2.0","result":"084f7bf4e4b94152a4ef232bea08cba630f7b98cfecc7ae42cbc69a61ea43721","id":"curltest"}
rpc/client.cpp にそれっぽい構造体があったので、
てっきり bitcoin-cli
が -named
を JSON配列に置き換えているものだと思っていたのだ。
どれでも使えるのか?
ただ、これは help
に書いていない。
少なくとも sendtoaddress
には curl
での例も載ってない。
なので、どのコマンドでも使えるのかは自信がない。
ドキュメントがあった。
Bitcoin Core v25.0 のリリースノート に new named parameter ということでリンクされていた。
“JSON-RPC server” が by-position と by-name の両方に対応したのだ。
つまり bitcoind
の方なので JSON-RPC として名前パラメータの方も使ってよいのだ。
もちろん by-position もいままで通り使えるし、なんと混在までできるようだ。
-named
を付けたら全部名前付きにしないといけないと思っていたが、そうではないのね。
というわけで、Bitcoin Core のバージョンが新しければ使ってよいということである。