Go-Ethereum
如何在 Go 中創建 dapp?
我了解 dapp 在 javascript 中的開發過程。Web3 api 用於訪問已部署的合約,而 truffle 可用於部署。我想為我的乙太坊合約使用 Go 語言創建一個 api,以便我可以將它連接到在 go 中創建的應用程序的其餘部分。是否可以用 go 代替 js 開發所有東西?如果是,請指點我的資源。我在乙太坊的github 頁面上找不到類似的東西。
一旦你弄清楚如何開始使用 Go 中的智能合約和發送交易等基礎知識,創建 dapp 就很簡單。
這是乙太坊開發與 Go 書中的一個範例。
商店.sol
pragma solidity ^0.4.24; contract Store { event ItemSet(bytes32 key, bytes32 value); string public version; mapping (bytes32 => bytes32) public items; constructor(string _version) public { version = _version; } function setItem(bytes32 key, bytes32 value) external { items[key] = value; emit ItemSet(key, value); } }
編譯
solc --abi Store.sol | awk '/JSON ABI/{x=1;next}x' > Store.abi solc --bin Store.sol | awk '/Binary:/{x=1;next}x' > Store.bin abigen --bin=Store.bin --abi=Store.abi --pkg=store --out=Store.go
例子.go
package main import ( "fmt" "log" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" store "./contracts" ) func main() { client, err := ethclient.Dial("https://rinkeby.infura.io") if err != nil { log.Fatal(err) } privateKey, err := crypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19") if err != nil { log.Fatal(err) } publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) if !ok { log.Fatal("error casting public key to ECDSA") } fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) nonce, err := client.PendingNonceAt(context.Background(), fromAddress) if err != nil { log.Fatal(err) } gasPrice, err := client.SuggestGasPrice(context.Background()) if err != nil { log.Fatal(err) } auth := bind.NewKeyedTransactor(privateKey) auth.Nonce = big.NewInt(int64(nonce)) auth.Value = big.NewInt(0) // in wei auth.GasLimit = uint64(300000) // in units auth.GasPrice = gasPrice address := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54") instance, err := store.NewStore(address, client) if err != nil { log.Fatal(err) } key := [32]byte{} value := [32]byte{} copy(key[:], []byte("foo")) copy(value[:], []byte("bar")) tx, err := instance.SetItem(auth, key, value) if err != nil { log.Fatal(err) } fmt.Printf("tx sent: %s", tx.Hash().Hex()) // tx sent: 0x8d490e535678e9a24360e955d75b27ad307bdfb97a1dca51d0f3035dcee3e870 result, err := instance.Items(nil, key) if err != nil { log.Fatal(err) } fmt.Println(string(result[:])) // "bar" }
如果你想在 Go 中建構一個 API,你所要做的就是使用 RPC/IPC 建構它。只需在 Go 中建構一個通過 RPC/IPC 與乙太坊網路互動的庫。然後,您可以在 Go 中建構 dapp,這些 dapp 將與任何獨立於實現的乙太坊客戶端進行互動。