合約的另一種調用方式——IPC

本文在 區塊鏈技術中文社區 同步發表

n

IPC調用

n

除了常見的通過RPC去調用/部署合約,還有另外一種選擇——IPC。相對於RPC,IPC的方式更加高效,配合以太官方提供的工具 abigen 可以極大的提高開發效率。深入解析ABI 一文中已經講解了abigen的代碼解析及用法,此文不再贅述

在啟動節點的時候,會有一個段info, 它指明了此節點的rpc和ipc相關信息,如下/home/luren5/ethereum/cdata/geth.ipc 即映射文件

n

INFO [06-25|15:56:16] IPC endpoint opened: /home/luren5/ethereum/cdata/geth.ipcnINFO [06-25|15:56:16] HTTP endpoint opened: http://0.0.0.0:8080n

準備合約文件和綁定文件

n

此處只是演示,重點不在於合約本身,所以我們還是繼續使用那個最簡單的合約demo

n

pragma solidity ^0.4.4;ncontract test { n string public a;n function modify_a(string val) {n a = val;n }n}n

生成綁定文件

n

abigen --sol test.sol -pkg main --lang go --out cc.gon

鑒於篇幅,此處不再展示生成的綁定文件cc.go內容

n

部署

n

綁定文件裡面生成了與這個合約的交互的所有方法,包括部署合約的方法,我們只需要寫一個客戶端來調用這些方法即可。在部署合約之前需要先準備一個賬戶,並且賬戶裡面需要有一定的資產,部署合約也是一筆交易,這筆交易即從這個賬戶發出的

n

package mainnnimport (n "fmt"n "os"n "strings"n "github.com/ethereum/go-ethereum/accounts/abi/bind"n "github.com/ethereum/go-ethereum/ethclient"n)nnconst key = `{"address":"34851ee7379fd43be25df08ab84b7402269fefc8","crypto":{"cipher":"aes-128-ctr","ciphertext":"6e50301e8b138e72e3a2f68a10279b6ee45535642f2f443b46abecd7b33f6a5d","cipherparams":{"iv":"c835c47b5ba30d400e2a6258725a26e8"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"794bc3d63a3258f7c6f7362122a133bdf00360afafeb445bd76075f54cbf3afe"},"mac":"906050c8ed59b26cb0fad60f1fb3719a701f9c9fd90637c2e6e707bf5f78925d"},"id":"e0c54cf9-55d6-4396-afb6-3d6850c86a2a","version":3}`nnfunc main() {n //conn, err := rpc.NewIPCClient("/home/luren5/ethereum/cdata/geth.ipc")n conn, err := ethclient.Dial("/home/luren5/ethereum/cdata/geth.ipc")n if err != nil {n fmt.Println("Failed to connect to the Ethereum client:", err)n os.Exit(0)n }nn auth, err := bind.NewTransactor(strings.NewReader(key), "123456")n if err != nil {n fmt.Println("Failed to create authorized transactor:", err)n os.Exit(0)n }nn // address, tx, token, err:= DeployTest(auth, conn)n // Deploy a new awesome contract for the binding demon address, tx, test, err := DeployTest(auth, conn)n if err != nil {n fmt.Println("Failed to deploy new token contract:", err)n os.Exit(0)n }n fmt.Printf("Contract pending deploy: 0x%xn", address)n fmt.Printf("Transaction waiting to be mined: 0x%xnn", tx.Hash())n}n

執行這段代碼,如果一切正常會返回合約賬戶地址,和這筆交易的hash,當然它還在txpool裡面待打包

n

Contract pending deploy: 0xda07f7faa6359fe87da9bc2898e068a3a4cdafa6nTransaction waiting to be mined: 0x2d818d62d72a39f5ded08bbe7a653a903ec647428161d1f09e3df0233473d7e6n

推薦閱讀:

2017年下半年比特幣價格與山寨幣價格走勢會如何?
如何評價小蟻股最近的瘋漲?
區塊鏈是一種不可篡改、高度安全且透明的共享網路,那為什麼無法防止交易平台跑路和ICO 項目的風險?

TAG:区块链Blockchain | 以太坊 |