sendtoaddress APIコールの変更提案
BitcoinのJSON-RPC APIに一つ小さな変更を提案する:Bitcoinの送信が成功した際にトランザクションIDを返すようにする。
なぜか? アプリケーションのウォレットに出入りするすべてのコインの完全な監査証跡を保持したいからだ。アプリケーションが行うアクションに対応するBitcoinネットワーク上の特定のトランザクションを追跡したい。代替案はsendtoaddressを呼んでからlisttransactionsを呼ぶことだが、2つの類似したトランザクション(同じ金額を同じアドレスに)がほぼ同時に発生した場合、正しく動作しない。
そこで、最もシンプルなことを提案する:JSON-RPCのsendtoaddressコールを変更して、文字列’sent:‘の後に256ビットの16進数トランザクションIDを返すようにする。
これは、正確に文字列’sent’を探しているアプリケーションを壊す可能性がある(現在のsendtoaddressの返り値がそれだ)。修正は文字列が’sent’で始まるかどうかを確認するようにアプリを変更するだけだ。
考えたが良くないと思う代替案:
- 古いアプリを壊さないよう新しいAPIコールにする(sendtoaddress2? ダサい)
- 送信成功時に’sent:…’の代わりにトランザクションIDのみを返す
- より多くの情報を含む配列を返す(例えば [ “tx_id”: ”…”, “fee” : 0.0 ])
コメント/批判は?
tx-id以外の追加情報を返したい場合はどうなるのか?
将来の互換性のために、フラグは(a)現在の’sent’のみを返すか、(b)tx-idやその他のものを含むJSONマップを返すかの選択を提示すべきだと思う。
tx-id以外の追加情報を返したい場合はどうなるのか?
将来の互換性のために、フラグは(a)現在の’sent’のみを返すか、(b)tx-idやその他のものを含むJSONマップを返すかの選択を提示すべきだと思う。
‘gettransaction tx_id’ APIコールは私のショートリストに入っている。
他のみんなはどう思う? sendtoaddress … trueはtx_idだけを返し、詳細が必要なら別のAPIコールを行う方式にすべきだろうか? それともArrayを返すべきだろうか?
‘getblock’が存在する以上、‘gettransaction’は必要なのだろうか?
後方互換性のためにAPIを複雑にし始めるには時期尚早だ。
単に <txid> を返せばいい。
JGジェフ・ガージックの投稿(2010年8月13日20:13 UTC)tx-id以外にさらに情報を返したくなったら、どうする?
将来の互換性のためにも、フラグでは(a)現在の ‘sent’ だけを返すか、(b)tx-idやおそらく他の情報も含むJSONマップを返すか、を選べるようにしておくべきだろう。
‘gettransaction tx_id’ APIコールは私のショートリストに入っている。
他のみんなはどう思う? sendtoaddress … trueはtx_idだけを返し、詳細が必要なら別のAPIコールを行う方式にすべきだろうか? それともArrayを返すべきだろうか?
どこまで凝りたいか次第だな。
ブール値を超えて、必要な機能ごとにフラグを追加していくこともできる。そうすれば、機能が増えるたびに引数にブール値を山積みしていくのではなく、新しい機能に対して開かれた形にできる。
sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]
-tx_id : 受け取り先bitcoinアドレスのtx IDを返す
-dance : ダンスのハイスコアを返す
-moon : 現在の月相を返す
つまり、後で多くの機能が追加されたときも、sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to] true false true true falseの代わりに、単純にsendtoaddress -tx-_id <bitcoinaddress> <amount> [comment] [comment-to] と書けるようになる。
後方互換性のためだけにAPIをごちゃごちゃさせるには時期尚早だ。 単に
<txid>を返せばいい。
「シンプルに保つ」に私が反論することはない。
そのためのパッチは些細なものだ。
diff --git a/rpc.cpp b/rpc.cpp
index 920fe90..35a336f 100644
--- a/rpc.cpp
+++ b/rpc.cpp
@@ -364,7 +364,7 @@ Value sendtoaddress(const Array& params, bool fHelp)
string strError = SendMoneyToBitcoinAddress(strAddress, nAmount, wtx);
if (strError != "")
throw runtime_error(strError);
- return "sent";
+ return wtx.GetHash().ToString();
} これはこういう意味だったと思うんだが、
return "<" + wtx.GetHash().ToString() + ">";
違うか?