Python
如何通過使用 bitcoind 的地址獲取最新的未使用交易?
我想建構一個伺服器,它提供以下 API:
- 1.通過地址獲取餘額。
- 2.獲取最新的未使用交易。
- 3.廣播交易。
首先,我知道我可以通過區塊鍊和coinb完成上述工作,但我想建構自己的 API。我用 Python 程式碼嘗試過的列表如下:
import binascii import json from decimal import Decimal from pprint import pprint from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException from config import ConfigBasic class BitPort(object): def __init__(self, config=None): self.conf = ConfigBasic() # pass self.rpc = AuthServiceProxy("http://{}:{}@{}".format( self.conf.rpc_user, self.conf.rpc_password, self.conf.rpc_host)) def get_amount_by_addr(self, addr): return self.rpc.getreceivedbyaddress(addr) def get_unconfirm(self, addr): return self.rpc.getunconfirmedbalance(addr) def get_unspent(self, addr): """ @param addr: A array with address, ["0xxxxxx", "0x122222"] """ return self.rpc.listunspent(0, 999999, addr) def sign_rawtransaction(self, addr): fee_obj = self.rpc.estimatesmartfee(6) fee = fee_obj.get("feerate") def sendrawtransaction(self, address, pubkey): pass if __name__ == '__main__': addr = '2NCTreR1GmHXMNSYnt2J76QZgv8PH1k4PHB' addr = '2MsHfXEmutS2GWPgK55JD4i1gKSFYmJgKXv' addr = 'n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi' bp = BitPort(config=ConfigBasic) print(bp.get_amount_by_addr(addr)) #print(bp.get_unconfirm(addr)) print(bp.get_unspent([addr]))
比方說,為什麼我需要做這樣的事情。客戶端需要檢查有多少可用資金。所以我需要提供1。客戶端也想把錢轉給別人,所以我需要把它的交易廣播到公共鏈上,但是在這之前,我需要客戶端做一個十六進制的交易,這需要伺服器端提供一個用於獲取未使用交易的 API。為什麼?
因為進行原始交易至少需要以下內容:
- 1.vout(來自未使用的交易)
- 2.txid(來自未使用的交易)
- 3.金額(使用者自定義)
- 4.fee(預設值可以)
- 5.公鑰(客戶端儲存或自行計算)
- 6.私鑰客戶端儲存或自行計算)
來自許多教程,例如How to create a raw transaction,這很好。但沒有提到如何
unspent
通過地址獲取。不存放在bitcoind
側面。不幸的是,我只能通過
bitcoind
節點中的錢包地址獲取所有交易。一旦我嘗試了某人的地址,我得到了以下異常:Traceback (most recent call last): File "core.py", line 43, in <module> print(bp.get_amount_by_addr(addr)) File "core.py", line 17, in get_amount_by_addr return self.rpc.getreceivedbyaddress(addr) File "/Users/frank/venv/bitcoin/lib/python2.7/site-packages/bitcoinrpc/authproxy.py", line 141, in __call__ raise JSONRPCException(response['error']) bitcoinrpc.authproxy.JSONRPCException: -4: Address not found in wallet
順便說一句,我執行它
testnet
,有人幫我嗎?
Bitcoind 不會為非錢包地址的交易編制索引。如果您想自己建構它,您將需要:
txindex=1
在你的 bitcoin.conf 中啟用- 重新掃描鏈
- 設置blocknotify,然後逐塊解析鏈上的區塊,建立一個索引,哪些輸出已經被花費,哪些沒有,以及每個交易涉及哪些地址
然後,當使用特定地址時,您首先查詢數據庫中所有未使用的輸出,然後可以使用
getrawtransaction
獲取未使用的 tx 資訊(儘管您可以在索引中儲存足夠的資訊而無需進行getrawtransaction
呼叫)。或者,您可以執行諸如 ElectrumX 或洞察力之類的東西,它們將為您完成上述所有工作。