1. 程式人生 > >go語言依靠bitcoind的JSON-RPC實現bitcoind-cli功能詳解

go語言依靠bitcoind的JSON-RPC實現bitcoind-cli功能詳解

首先我們看一下bitcoin對JSON-RPC的解釋:

3.2.5首次執行比特幣核心

當你第一次執行bitcoind時,它會提醒你用一個安全密碼給JSON-RPC介面建立一個配置檔案。該密碼控制對Bitcoin Core提供的應用程式程式設計介面(API)的訪問。

文章地址:http://book.8btc.com/books/6/masterbitcoin2cn/_book/ch03.html

 

我們瞭解到bitcoind提供一個API介面  可以通過HTTP直接對bitcoin函式進行呼叫

API介面定義:https://baike.baidu.com/item/api/10154

接下來我們知道bitcoin-cli實際是官方提供的http客戶端 同樣實現bitcoind的介面

 

那麼我們可不可以自己做一個客戶端 實現類似bitcond-cli的功能呢

答案是可以的

精通bitcoin一書對rpc的解釋為:

3.3.3使用比特幣核心的程式設計介面

bitcoin-cli helper對於探索Bitcoin Core API和測試功能非常有用。 但是應用程式設計介面的全部要點是以程式設計方式訪問功能。 在本節中,我們將演示從另一個程式訪問Bitcoin Core。

Bitcoin Core的API是一個JSON-RPC介面。 JSON代表JavaScript物件符號,它是一種非常方便的方式來呈現人類和程式可以輕鬆閱讀的資料。 RPC代表遠端過程呼叫,這意味著我們通過網路協議呼叫遠端(位於比特幣核心節點)的過程(函式)。 在這種情況下,網路協議是HTTP或HTTPS(用於加密連線)。

文章地址:http://book.8btc.com/books/6/masterbitcoin2cn/_book/ch03.html

 

下面是我用go語言實現web服務 訪問bitcoind-rpc介面的實驗圖

查詢餘額

 

查詢錢包資訊

 

查詢雜湊值

 

通過雜湊值查詢塊的資訊

 

類似的功能可以一直新增

原始碼如下:

bitcoincode函式是整個互動的核心

//通過變數與bitcoind進行互動
func bitcoincode(s string) string {
	str := strings.Fields(s)
	url := "http://user:
[email protected]
:18332" curl1 := `{"jsonrpc":"1.0","id":"curltest","method":"` curl2 := `","params":[` curl3 := `]}` var quest string switch len(str) { case 1: quest = fmt.Sprintln(curl1+str[0]+curl2+curl3) case 2: quest = fmt.Sprintln(curl1+str[0]+curl2+"\""+str[1]+"\""+curl3) } fmt.Println(quest) var jsonStr = []byte(quest) req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) req.Header.Set("X-Custom-Header", "myvalue") req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) fmt.Println("response Body:", string(body)) return string(body) }

業務模組 

//實現web命令及暴露埠
func run() {
	http.HandleFunc("/block_chain/getbalance", blockChainGetBalance)
	http.HandleFunc("/block_chain/getwalletinfo", blockChainGetWalletInfo)
	http.HandleFunc("/block_chain/getbestblockhash", blockChainGetBestBlockHash)
	http.HandleFunc("/block_chain/getblock", blockChainGetBlock)
	http.ListenAndServe(":8332", nil)
}

//實現getbalance
func blockChainGetBalance(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, bitcoincode("getbalance"))
}


//實現getwalletinfo
func blockChainGetWalletInfo(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, bitcoincode("getwalletinfo"))
}

//實現GetBestBlockHash
func blockChainGetBestBlockHash(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, bitcoincode("getbestblockhash"))
}

//實現GetBlock
func blockChainGetBlock(w http.ResponseWriter, r *http.Request) {
	blockData := r.URL.Query().Get("data")
	io.WriteString(w, bitcoincode(blockData))
}

func main() {
	run()
}

根據上面原始碼可以實現一個自己定製的錢包客戶端

附上bitcoind-rpc命令大全 https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list