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