Go-Ethereum

如何在 Go 中創建 dapp?

  • June 4, 2018

我了解 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 將與任何獨立於實現的乙太坊客戶端進行互動。

引用自:https://ethereum.stackexchange.com/questions/31534