探索比特币源码3-熟悉RPC接口
探索比特幣源碼3-熟悉RPC接口
比特幣核心客戶端實現(xiàn)了JSON-RPC接口,這個接口可以通過命令行幫助程序bitcoin-cli訪問,也可以通過編程的形式在程序中訪問。
本文主要探索3點:
* 什么是JSON-RPC接口
* 使用 bitcoin-cli 進(jìn)行 JSON-RPC 接口調(diào)用實驗
* 區(qū)塊鏈相關(guān)RPC接口快速一覽
在下一文中我們重點研究如何通過編程的形式調(diào)用 Bitcoin Core 的 JSON-RPC
什么是JSON-RPC接口
作為一個我沒接觸過的概念,JSON-RPC是什么?以下是我的一些簡單理解,如有錯誤請指正
首先RPC翻譯過來應(yīng)該是遠(yuǎn)程過程調(diào)用(Remote Procedure Call),它是一種通信協(xié)議,規(guī)定了運(yùn)行于一臺計算機(jī)上的程序如何調(diào)用另一臺計算機(jī)程序提供的接口或者說方法。
因此我覺得RPC可以作為一種API來理解,而JSON-RPC顯然是RPC協(xié)議的其中一種,通信傳輸?shù)臄?shù)據(jù)格式為JSON,即JavaScript對象符號。
當(dāng)你想調(diào)用服務(wù)器端的JSON-RPC接口,你需要發(fā)送一個JSON格式的請求。
同樣,當(dāng)你成功發(fā)起一個RPC調(diào)用后(除非是通知類型的請求),服務(wù)端也會進(jìn)行響應(yīng),響應(yīng)返回一個JSON對象。
一個請求對象包含下列成員:
* jsonrpc
* method
* params
* id
一個響應(yīng)對象包含下列成員:
* jsonrpc
* result
* error
* id
其中,jsonrpc是協(xié)議版本
method是請求調(diào)用的方法名稱,params是其對應(yīng)的參數(shù)
result是響應(yīng)的調(diào)用結(jié)果
error用來描述調(diào)用中出現(xiàn)的錯誤及類型
id的作用應(yīng)該是便于調(diào)用者將請求與響應(yīng)一一對應(yīng)
這是一組JSON-RPC的調(diào)用及響應(yīng)示例
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3} <-- {"jsonrpc": "2.0", "result": 19, "id": 3}該示例模擬了調(diào)用RPC接口,執(zhí)行服務(wù)器上的”subtract”方法,該方法實現(xiàn)了一個減法的功能,使用”params”指定方法的參數(shù)。隨后,服務(wù)器返回響應(yīng)結(jié)果:42-23=19
更詳細(xì)的解釋及調(diào)用示例可以參見wikiJSON-RPC
使用bitcoin-cli進(jìn)行JSON-RPC接口調(diào)用實驗
就像之前幾篇文章用到的bitcoin-cli getblockchaininfo一樣,命令行幫助程序bitcoin-cli提供了對Bitcoin Core客戶端JSON-RPC接口的訪問。
我們來進(jìn)行一些調(diào)用的交互實驗,首先使用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接口被分為區(qū)塊鏈、控制、生成、挖礦、網(wǎng)絡(luò)、交易、應(yīng)用、錢包等模塊
我們以Blockchain類別下的命令為例進(jìn)行探索
查找到RPC接口的名稱后,可以進(jìn)一步使用help獲得相應(yīng)命令的更多幫助,包括詳細(xì)說明和參數(shù)信息
$ 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進(jìn)一步獲取getbestblockhash命令的幫助信息
區(qū)塊鏈相關(guān)RPC接口快速一覽
我是一邊使用help命令,一邊對照區(qū)塊鏈瀏覽器來對比特幣RPC接口進(jìn)行學(xué)習(xí)的
這個過程中,會很枯燥并且會遇到很多理解上的障礙,但可以對比特幣客戶端具有的功能和區(qū)塊鏈中的一些術(shù)語概念加深理解,不妨試試。
下面是我總結(jié)的區(qū)塊鏈相關(guān)功能所有RPC命令的簡單解釋,可以用于快速的查找和熟悉接口。
其余模塊的相關(guān)RPC接口我打算用到時再學(xué)習(xí),這樣能提升下學(xué)習(xí)比特幣源碼的進(jìn)度。
getblock “blockhash” ( verbosity )
獲取指定hash值對應(yīng)區(qū)塊的區(qū)塊信息
getblockchaininfo
獲取區(qū)塊鏈運(yùn)行的各種狀態(tài)信息,例如當(dāng)前區(qū)塊高度,是否處于初始化區(qū)塊同步階段,區(qū)塊鏈數(shù)據(jù)占用磁盤大小的估計值等等。
getblockcount
獲取最長鏈中的區(qū)塊數(shù)量
getblockhash height
獲取最長鏈中指定高度區(qū)塊的hash值
getblockheader “hash” ( verbose )
獲取指定hash值對應(yīng)區(qū)塊的區(qū)塊頭
getchaintips
獲取區(qū)塊樹所有已知的提示信息,包括主鏈和孤立分支
getchaintxstats ( nblocks blockhash )
獲取有關(guān)區(qū)塊鏈中交易總數(shù)和比率的統(tǒng)計數(shù)據(jù)
getdifficulty
獲取工作量證明的難度(作為最小難度的倍數(shù)返回)
getmempoolancestors txid (verbose)
獲取mempool中指定交易的所有父交易
getmempooldescendants txid (verbose)
獲取mempool中指定交易的所有子交易
getmempoolentry txid
獲取指定交易的內(nèi)存池數(shù)據(jù)
getmempoolinfo
獲取交易內(nèi)存池狀態(tài)的詳細(xì)信息
getrawmempool ( verbose )
獲取內(nèi)存池中所有的交易信息
gettxout “txid” n ( include_mempool )
獲取一個未花費交易輸出(utxo)的詳細(xì)信息
gettxoutproof [“txid”,…] ( blockhash )
獲取某一個交易”txid”被包含于某一個區(qū)塊中的證明
gettxoutsetinfo
獲取utxo集合的統(tǒng)計信息
preciousblock “blockhash”
將一個區(qū)塊視為在同樣工作量下比其他區(qū)塊更早地被接收
pruneblockchain
將區(qū)塊鏈裁剪到指定的高度或時間戳
savemempool
將內(nèi)存池中數(shù)據(jù)存儲到磁盤
verifychain ( checklevel nblocks )
驗證區(qū)塊鏈數(shù)據(jù)庫,可以設(shè)置驗證的數(shù)量,徹底程度等
verifytxoutproof “proof”
驗證一個交易的憑證,返回憑證對應(yīng)的交易
總結(jié)
以上是生活随笔為你收集整理的探索比特币源码3-熟悉RPC接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LwIP应用开发笔记之四:LwIP无操作
- 下一篇: opencv感兴趣通道COI的使用