Go-Ethereum
使用 golang 部署智能合約
我嘗試使用 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 編譯器生成的字節碼。