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