Python

如何通過使用 bitcoind 的地址獲取最新的未使用交易?

  • July 28, 2018

我想建構一個伺服器,它提供以下 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 不會為非錢包地址的交易編制索引。如果您想自己建構它,您將需要:

  1. txindex=1在你的 bitcoin.conf 中啟用
  2. 重新掃描鏈
  3. 設置blocknotify,然後逐塊解析鏈上的區塊,建立一個索引,哪些輸出已經被花費,哪些沒有,以及每個交易​​涉及哪些地址

然後,當使用特定地址時,您首先查詢數據庫中所有未使用的輸出,然後可以使用getrawtransaction獲取未使用的 tx 資訊(儘管您可以在索引中儲存足夠的資訊而無需進行getrawtransaction呼叫)。

或者,您可以執行諸如 ElectrumX 或洞察力之類的東西,它們將為您完成上述所有工作。

引用自:https://bitcoin.stackexchange.com/questions/77685