這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
install btcd
go get -u github.com/Masterminds/glidegit clone https://github.com/btcsuite/btcd $GOPATH/src/github.com/btcsuite/btcdcd $GOPATH/src/github.com/bitsuit/btcdglide installgo install . ./cmd/...
btcd的項目都是通過glide進行管理的,因此在安裝btcd的時候還需要安裝glide
run btcd(simnet)
btcd -u shenxin -P shenxin --simnet --miningaddr=SUsbWJE1VMREXFUv8KcBmke7cPsSXaFvnE
如果需要自動挖礦要加上 --generate 參數,--miningaddr= 設定挖礦時接收比特幣的地址。如果沒有設定自動挖礦,可以在後面的用戶端中使用 generate() 方法來手動挖礦(由於 simnet 上挖礦速度太快,不方便測試,因此此處使用手動挖礦)。
需要注意的是,當運行simnet時需要運行至少兩個節點才能挖礦,不然不能進行挖礦(或者說挖不到礦)。
install btcwallet
git clone https://github.com/btcsuite/btcwallet $GOPATH/src/github.com/btcsuite/btcwalletcd $GOPATH/src/github.com/btcsuite/btcwalletglide installgo install . ./cmd/...
如果直接使用的 btcwallet 寫用戶端需要進行下面的操作:將 $GOPATH/src/github.com/btcsuite/btcwallet/vendor 檔案夾下的所有檔案複製到 $GOPATH/src/下面($GOPATH/src/檔案夾下已有的檔案可以不用複製)。複製之後刪除vendor檔案夾,以保證在後面使用btcwallet用戶端的時候不會出現引用包路徑不同導致的錯誤。
create btcwallet(testnet)
btcwallet -u shenxin -p shenxin --simnet --create
根據終端裡面的提示輸入對應的操作符,並設定錢包密碼為:"shenxin"。命令中的 -u 和 -p 是錢包串連btcd grpc服務需要的帳號密碼,或者使用 "--btcdusername="、"--btcdpassword=" 來設定串連btcd需要的帳號及密碼,但是這樣將不會開啟btcwallet的rpc服務。
run btcwallet(testnet) server
btcwallet -u shenxin -p shenxin --walletpass=shenxin --simnet
btcd和btcwallet都是啟動並執行simnet,因此btcwallet啟動之後會自動連接到btcd。
create btcwallet clien
package mainimport ( "fmt" "io/ioutil" "log" "path/filepath" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/rpcclient" "github.com/btcsuite/btcutil")// default account address: SUsbWJE1VMREXFUv8KcBmke7cPsSXaFvnE// main account address: SiAXFyKMF6afKEhoTYAPSYGWxbCRUddqTh// ss account address: Sad47SLU1hsgiQb2Ew6jf39PfqhJzEjERZ SjPHLr6MUn7fjjBuZK6a3pj9NFgYGvpu25func main() { client := initClient() fmt.Println(client.ListAccounts()) fmt.Println(transferFrom("main", "SUsbWJE1VMREXFUv8KcBmke7cPsSXaFvnE", 5)) fmt.Println(transfer("Sad47SLU1hsgiQb2Ew6jf39PfqhJzEjERZ", 0.5)) generate() fmt.Println(getBalanceByAccount("default")) fmt.Println(getBalanceByAccount("main")) fmt.Println(getBalanceByAccount("ss"))}func initClient() *rpcclient.Client { ntfnHandlers := rpcclient.NotificationHandlers{ OnAccountBalance: func(account string, balance btcutil.Amount, confirmed bool) { log.Printf("New balance for account %s: %v", account, balance) }, } certHomeDir := btcutil.AppDataDir("btcwallet", false) certs, err := ioutil.ReadFile(filepath.Join(certHomeDir, "rpc.cert")) if err != nil { log.Fatal(err) } connCfg := &rpcclient.ConnConfig{ Host: "localhost:18554", Endpoint: "ws", User: "shenxin", Pass: "shenxin", Certificates: certs, } client, err := rpcclient.New(connCfg, &ntfnHandlers) if err != nil { log.Fatal(err) } return client}func transferFrom(account, addr string, amount float64) bool { client := initClient() err := client.WalletPassphrase("shenxin", 5) if err != nil { log.Fatal(err) } address, _ := btcutil.DecodeAddress(addr, &chaincfg.SimNetParams) btcAmount, _ := btcutil.NewAmount(amount) hash, err := client.SendFrom(account, address, btcAmount) if err != nil { log.Fatal(err) return false } else { log.Println("txid:", hash) return true }}func transfer(addr string, amount float64) bool { client := initClient() err := client.WalletPassphrase("shenxin", 5) if err != nil { log.Fatal(err) } address, _ := btcutil.DecodeAddress(addr, &chaincfg.SimNetParams) btcAmount, _ := btcutil.NewAmount(amount) hash, err := client.SendToAddress(address, btcAmount) if err != nil { log.Fatal(err) return false } else { log.Println("txid:", hash) return true }}func generate() bool { client := initClient() _, err := client.Generate(12) if err != nil { return false } else { return true }}func getBalanceByAccount(account string) btcutil.Amount { client := initClient() err := client.WalletPassphrase("shenxin", 5) if err != nil { log.Fatal(err) } amount, err := client.GetBalance(account) if err != nil { return 0 } else { return amount }}
節點中有一個預設賬戶 "default",另外調用client.CreateNewAccount()建立兩個賬戶 "ss" "main"。使用 client.GetNewAddress("accountname") 分別在各個賬戶中建立地址。
在初始化 address 的時候需要設定 chaincfg.params 參數,參數要和啟動並執行節點類型相對應,不然就會出現錯誤(例如btcd啟動並執行是simnet,因此初始化address的時候使用的是&chaincfg.SimNetParams)。
client.SendToAddress(address, amount) 方法預設是從 "default" 賬戶發送比特幣。
待解決:
- 每次調用錢包方法的時候,錢包軟體日誌都會提示報錯(不影響用戶端運行):RPCS: Websocket receive failed from client [::1]:59799: websocket: close 1006 unexpected EOF