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> を返せばいい。
ジェフ・ガージックの投稿(2010年8月13日 20:13 UTC)tx-id以外にさらに情報を返したくなったら、どうする?
将来の互換性のためにも、フラグでは(a)現在の ‘sent’ だけを返すか、(b)tx-idやおそらく他の情報も含むJSONマップを返すか、を選べるようにしておくべきだろう。
‘gettransaction tx_id’ APIコールは俺の短いTODOリストに入っている。
他の人の意見はどうだ。sendtoaddress … true は tx_id だけを返し、詳細が必要なら別のAPIコールを呼ぶ形にすべきか? それとも配列を返すべきか?
どこまで凝りたいか次第だな。
ブール値を超えて、必要な機能ごとにフラグを追加していくこともできる。そうすれば、機能が増えるたびに引数にブール値を山積みしていくのではなく、新しい機能に対して開かれた形にできる。
sendtoaddress -dance : ダンスのハイスコアを返す
-moon : 現在の月相を返す
つまり、後で多くの機能が追加されたときも、
sendtoaddress
後方互換性のためだけにAPIをごちゃごちゃさせるには時期尚早だ。 "" を返せばいい。
「シンプルに保つ」に俺が反論することはない。
そのためのパッチは些細なものだ。
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() + ">";
違うか?