Bitcoind
如何找到給定 txid 的零錢/發件人地址?
假設我正在提供像 SatoshiDice 這樣的服務,當我收到一筆交易時,我想退還一些錢。我在哪裡可以找到發件人地址?
如果我執行它,例如:
bitcoin-cli gettransaction 8386a8d2870c0df79f652ef4d981b21649ebf40601948c1c0709de0f02de8c8c
我得到:
{ "amount" : -0.00750000, "fee" : -0.00050000, "confirmations" : 10130, "blockhash" : "00000000000000002b44cdc1b2fe4ec2aa6b31b25ae8eedc8d1ef16799bd3114", "blockindex" : 13, "blocktime" : 1398584440, "txid" : "8386a8d2870c0df79f652ef4d981b21649ebf40601948c1c0709de0f02de8c8c", "walletconflicts" : [ ], "time" : 1398584248, "timereceived" : 1398584248, "details" : [ { "account" : "", "address" : "1Gxua3AptLgz1DWbG38dakLP4DVY2Jia4d", "category" : "send", "amount" : -0.00750000, "fee" : -0.00050000 } ], "hex" : "01000000013c75459d163a5343725362a5b412dde392784814ec04c4e77df7ee5edbd10352010000006a47304402200ee65c9f757eb6c240efe5a7e4427e04174a32da14b1eef459d36d61d031f6e702202d6b5383f86f155d92a494e80a1242af7e160faf16d597ea457b6e3bf08bb1ca012102be7759e73363488269f0257158177f3295af42d1f3a6b2fdf8fb4380b1d16ae9ffffffff0250c30000000000001976a9144233e899673c755c11664d43d0a83a56d06ce23188acb0710b00000000001976a914af1ca5c63970b893a4ef79d030b28ca91ccd22ce88ac00000000" }
我可以在 中找到我要查找的地址
details -> address
。但這是合適的地方嗎?details 數組可以是空的還是有多個元素?我知道已經有兩個類似的問題:如何找出交易的發件人以及網站檢測來自綠色地址的付款的最佳方式是什麼?但問題是這些問題並沒有解釋我是否可以安全地使用 gettransaction 來找到它。
按照答案提示,我能夠做到這一點:
bitcoin-cli decoderawtransaction "01000000013c75459d163a5343725362a5b412dde392784814ec04c4e77df7ee5edbd10352010000006a47304402200ee65c9f757eb6c240efe5a7e4427e04174a32da14b1eef459d36d61d031f6e702202d6b5383f86f155d92a494e80a1242af7e160faf16d597ea457b6e3bf08bb1ca012102be7759e73363488269f0257158177f3295af42d1f3a6b2fdf8fb4380b1d16ae9ffffffff0250c30000000000001976a9144233e899673c755c11664d43d0a83a56d06ce23188acb0710b00000000001976a914af1ca5c63970b893a4ef79d030b28ca91ccd22ce88ac00000000"
產生:
{ "txid" : "8386a8d2870c0df79f652ef4d981b21649ebf40601948c1c0709de0f02de8c8c", "version" : 1, "locktime" : 0, "vin" : [ { "txid" : "5203d1db5eeef77de7c404ec14487892e3dd12b4a562537243533a169d45753c", "vout" : 1, "scriptSig" : { "asm" : "304402200ee65c9f757eb6c240efe5a7e4427e04174a32da14b1eef459d36d61d031f6e702202d6b5383f86f155d92a494e80a1242af7e160faf16d597ea457b6e3bf08bb1ca01 02be7759e73363488269f0257158177f3295af42d1f3a6b2fdf8fb4380b1d16ae9", "hex" : "47304402200ee65c9f757eb6c240efe5a7e4427e04174a32da14b1eef459d36d61d031f6e702202d6b5383f86f155d92a494e80a1242af7e160faf16d597ea457b6e3bf08bb1ca012102be7759e73363488269f0257158177f3295af42d1f3a6b2fdf8fb4380b1d16ae9" }, "sequence" : 4294967295 } ], "vout" : [ { "value" : 0.00050000, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 4233e899673c755c11664d43d0a83a56d06ce231 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a9144233e899673c755c11664d43d0a83a56d06ce23188ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1733nLJx6QrYa7AemEHXgq89G2NaWjPpRW" ] } }, { "value" : 0.00750000, "n" : 1, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 af1ca5c63970b893a4ef79d030b28ca91ccd22ce OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a914af1ca5c63970b893a4ef79d030b28ca91ccd22ce88ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1Gxua3AptLgz1DWbG38dakLP4DVY2Jia4d" ] } } ] }
這讓我找到零錢地址。
但是我可以跳過這些步驟並從“細節”中獲取嗎?
比特幣可能會使用來自不同地址的多個輸出來為交易提供資金。總是無法預測使用者在做什麼,例如,他們可能正在使用 CoinJoin,而實際的發送者可能是任何輸入。
還要記住,像 SatoshiDice 這樣的服務會造成巨大的網路壓力,因此更喜歡使用存款地址並讓使用者指定一個地址來取款。它解決了網路壓力和您的問題。
此外,永遠不要假設某個輸出是找零地址。使用者可能正在做任何事情(比如將其餘的發送給其他人)。
**編輯:**對我的和大衛施瓦茨的回答都投反對票並沒有任何幫助。不可能預測每個案例。用 Satoshi 客戶端開發人員的話來說;“有時文件限制是一項功能,而不是錯誤”。重要的一點是,如果你不得不問,那麼也許給你答案會弊大於利。唯一的方法是:
- **嘗試猜測找零地址。**如果有兩個輸出,您可以使用不屬於您的輸出。如果發件人有準確的輸出,那麼您甚至可能不會得到第二個輸出。如果有 >2 個輸出,您可能會使用最後一個輸出,但這會產生大量假設,任何甚至關心隱私的錢包都會隨機化輸出。
- **嘗試猜測發送地址。**如果有一個發送地址,您可以使用它,在多個的情況下,這是任何人的猜測(也許使用最上面的一個?)。
沒有人能回答這個問題。甚至我的回答也只是編造出來的,它不是為使用協議而分配的,只是基於某些錢包軟體的工作原理的猜測。
不過,我不能推薦足夠的反對這一點。這是非常危險的。任何了解比特幣如何運作的人都不推薦 SatoshiDice,它很受歡迎,因為它是第一個,如果不是第一個比特幣博彩網站的話。