golang版本比特幣節點及比特幣錢包使用

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.