探索比特币源码3-熟悉RPC接口
探索比特幣源碼3-熟悉RPC接口
比特幣核心客戶端實現了JSON-RPC接口,這個接口可以通過命令行幫助程序bitcoin-cli訪問,也可以通過編程的形式在程序中訪問。
本文主要探索3點:
* 什么是JSON-RPC接口
* 使用 bitcoin-cli 進行 JSON-RPC 接口調用實驗
* 區塊鏈相關RPC接口快速一覽
在下一文中我們重點研究如何通過編程的形式調用 Bitcoin Core 的 JSON-RPC
什么是JSON-RPC接口
作為一個我沒接觸過的概念,JSON-RPC是什么?以下是我的一些簡單理解,如有錯誤請指正
首先RPC翻譯過來應該是遠程過程調用(Remote Procedure Call),它是一種通信協議,規定了運行于一臺計算機上的程序如何調用另一臺計算機程序提供的接口或者說方法。
因此我覺得RPC可以作為一種API來理解,而JSON-RPC顯然是RPC協議的其中一種,通信傳輸的數據格式為JSON,即JavaScript對象符號。
當你想調用服務器端的JSON-RPC接口,你需要發送一個JSON格式的請求。
同樣,當你成功發起一個RPC調用后(除非是通知類型的請求),服務端也會進行響應,響應返回一個JSON對象。
一個請求對象包含下列成員:
* jsonrpc
* method
* params
* id
一個響應對象包含下列成員:
* jsonrpc
* result
* error
* id
其中,jsonrpc是協議版本
method是請求調用的方法名稱,params是其對應的參數
result是響應的調用結果
error用來描述調用中出現的錯誤及類型
id的作用應該是便于調用者將請求與響應一一對應
這是一組JSON-RPC的調用及響應示例
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3} <-- {"jsonrpc": "2.0", "result": 19, "id": 3}該示例模擬了調用RPC接口,執行服務器上的”subtract”方法,該方法實現了一個減法的功能,使用”params”指定方法的參數。隨后,服務器返回響應結果:42-23=19
更詳細的解釋及調用示例可以參見wikiJSON-RPC
使用bitcoin-cli進行JSON-RPC接口調用實驗
就像之前幾篇文章用到的bitcoin-cli getblockchaininfo一樣,命令行幫助程序bitcoin-cli提供了對Bitcoin Core客戶端JSON-RPC接口的訪問。
我們來進行一些調用的交互實驗,首先使用help命令查看所有可用的RPC接口:
$ bitcoin-cli help == Blockchain == getbestblockhash getblock "blockhash" ( verbosity ) getblockchaininfo getblockcount ...== Control == getmemoryinfo ("mode") help ( "command" ) logging ( <include> <exclude> ) stop uptime== Generating == generate nblocks ( maxtries ) generatetoaddress nblocks address (maxtries)== Mining == getblocktemplate ( TemplateRequest ) getmininginfo getnetworkhashps ( nblocks height ) prioritisetransaction <txid> <dummy value> <fee delta> submitblock "hexdata" ( "dummy" )== Network == addnode "node" "add|remove|onetry" clearbanned disconnectnode "[address]" [nodeid] getaddednodeinfo ( "node" ) ...== Rawtransactions == combinerawtransaction ["hexstring",...] createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,"data":"hex",...} ( locktime ) ( replaceable ) decoderawtransaction "hexstring" ( iswitness ) decodescript "hexstring" ...== Util == createmultisig nrequired ["key",...] estimatefee nblocks estimatesmartfee conf_target ("estimate_mode") signmessagewithprivkey "privkey" "message" validateaddress "address" verifymessage "address" "signature" "message"== Wallet == abandontransaction "txid" abortrescan addmultisigaddress nrequired ["key",...] ( "account" "address_type" ) backupwallet "destination" ...可以看到,所有RPC接口被分為區塊鏈、控制、生成、挖礦、網絡、交易、應用、錢包等模塊
我們以Blockchain類別下的命令為例進行探索
查找到RPC接口的名稱后,可以進一步使用help獲得相應命令的更多幫助,包括詳細說明和參數信息
$ bitcoin-cli help getbestblockhash getbestblockhashReturns the hash of the best (tip) block in the longest blockchain.Result: "hex" (string) the block hash hex encodedExamples: > bitcoin-cli getbestblockhash > curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getbestblockhash", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/上面展示了使用help進一步獲取getbestblockhash命令的幫助信息
區塊鏈相關RPC接口快速一覽
我是一邊使用help命令,一邊對照區塊鏈瀏覽器來對比特幣RPC接口進行學習的
這個過程中,會很枯燥并且會遇到很多理解上的障礙,但可以對比特幣客戶端具有的功能和區塊鏈中的一些術語概念加深理解,不妨試試。
下面是我總結的區塊鏈相關功能所有RPC命令的簡單解釋,可以用于快速的查找和熟悉接口。
其余模塊的相關RPC接口我打算用到時再學習,這樣能提升下學習比特幣源碼的進度。
getblock “blockhash” ( verbosity )
獲取指定hash值對應區塊的區塊信息
getblockchaininfo
獲取區塊鏈運行的各種狀態信息,例如當前區塊高度,是否處于初始化區塊同步階段,區塊鏈數據占用磁盤大小的估計值等等。
getblockcount
獲取最長鏈中的區塊數量
getblockhash height
獲取最長鏈中指定高度區塊的hash值
getblockheader “hash” ( verbose )
獲取指定hash值對應區塊的區塊頭
getchaintips
獲取區塊樹所有已知的提示信息,包括主鏈和孤立分支
getchaintxstats ( nblocks blockhash )
獲取有關區塊鏈中交易總數和比率的統計數據
getdifficulty
獲取工作量證明的難度(作為最小難度的倍數返回)
getmempoolancestors txid (verbose)
獲取mempool中指定交易的所有父交易
getmempooldescendants txid (verbose)
獲取mempool中指定交易的所有子交易
getmempoolentry txid
獲取指定交易的內存池數據
getmempoolinfo
獲取交易內存池狀態的詳細信息
getrawmempool ( verbose )
獲取內存池中所有的交易信息
gettxout “txid” n ( include_mempool )
獲取一個未花費交易輸出(utxo)的詳細信息
gettxoutproof [“txid”,…] ( blockhash )
獲取某一個交易”txid”被包含于某一個區塊中的證明
gettxoutsetinfo
獲取utxo集合的統計信息
preciousblock “blockhash”
將一個區塊視為在同樣工作量下比其他區塊更早地被接收
pruneblockchain
將區塊鏈裁剪到指定的高度或時間戳
savemempool
將內存池中數據存儲到磁盤
verifychain ( checklevel nblocks )
驗證區塊鏈數據庫,可以設置驗證的數量,徹底程度等
verifytxoutproof “proof”
驗證一個交易的憑證,返回憑證對應的交易
總結
以上是生活随笔為你收集整理的探索比特币源码3-熟悉RPC接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LwIP应用开发笔记之四:LwIP无操作
- 下一篇: opencv感兴趣通道COI的使用