Go-Ethereum

使用 golang 部署智能合約

  • December 16, 2021

我嘗試使用 go 和 go-ethereum 部署智能合約。為了部署它,我使用了 go-ethereum 庫中的 sendTransaction 函式,但是當我在 ropsten explorer 上檢查它時,它只是一個基本的交易而不是合約的創建。為什麼會這樣?

這是程式碼

package main

import (
       "context"
       "crypto/ecdsa"
       "fmt"
       "io/ioutil"
       "log"
       "strings"

       "github.com/ethereum/go-ethereum/common"
       "github.com/ethereum/go-ethereum/core/types"
       "github.com/ethereum/go-ethereum/crypto"
       "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
       // get the account private key from file .key
       key, err := ioutil.ReadFile(".key")
       if err != nil {
               log.Fatalln(err)
       }

       // connect into ropsten eth
       client, err := ethclient.Dial("https://speedy-nodes-nyc.moralis.io/bf6148e21d21cfe6e13519a7/eth/ropsten")
       if err != nil {
               log.Fatalln(err)
       }

       prv, err := crypto.HexToECDSA(strings.ReplaceAll(string(key), "\n", ""))
       if err != nil {
               log.Fatalln(err)
       }

       pubkey, ok := prv.Public().(*ecdsa.PublicKey)
       if !ok {
               log.Fatalln("not ok")
       }

       fromAddress := crypto.PubkeyToAddress(*pubkey)
       gasLimit := uint64(210000)
       gasPrice, err := client.SuggestGasPrice(context.Background())
       if err != nil {
               log.Fatalln(err)
       }

       sc, err := ioutil.ReadFile("./contracts/Token.sol")

       nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
       if err != nil {
               log.Fatalln(err)
       }

       // 0x + sc bytecode compiled using command "solcjs --bin ./Token.sol"
       data := []byte("0x"+string(sc))

       // create new transaction
       tx := types.NewTransaction(nonce, common.BytesToAddress([]byte{}), nil, gasLimit, gasPrice, data)

       // get the chain id
       chainId, err := client.NetworkID(context.Background())
       if err != nil {
               log.Fatalln(err)
       }

       // sign the transaction
       sgtx, err := types.SignTx(tx, types.NewEIP155Signer(chainId), prv)

       // send the transaction
       err = client.SendTransaction(context.Background(), sgtx)
       if err != nil {
               log.Fatalln(err)
       }

       fmt.Println(sgtx.Hash().Hex())
}

這就是結果

0xcf7f4ec9fc7add65b3d4b7e713f359e8efbaf0ec5d9166f7f504bd3ffc56b5f5

我不是 Go 開發人員,但我可以指出幾個錯誤的問題。

  • 應該有一個types.NewContractCreation應該用來部署合約的
  • 正在部署原始碼。它應該是由 solc 編譯器生成的字節碼。

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