概述: 用Go来读取已经部署的智能合约的字节码的教程。

读取智能合约的字节码

有时您需要读取已部署的智能合约的字节码。 由于所有智能合约字节码都存在于区块链中,因此我们可以轻松获取它。

首先设置客户端和要读取的字节码的智能合约地址。

  1. client, err := ethclient.Dial("https://rinkeby.infura.io")
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. contractAddress := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")

现在你需要调用客户端的codeAt方法。 codeAt方法接受智能合约地址和可选的块编号,并以字节格式返回字节码。

  1. bytecode, err := client.CodeAt(context.Background(), contractAddress, nil) // nil is latest block
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. fmt.Println(hex.EncodeToString(bytecode)) // 60806...10029

你也可以在etherscan上查询16进制格式的字节码 https://rinkeby.etherscan.io/address/0x147b8eb97fd247d06c4006d269c90c1908fb5d54#code

完整代码

contract_bytecode.go

  1. package main
  2. import (
  3. "context"
  4. "encoding/hex"
  5. "fmt"
  6. "log"
  7. "github.com/ethereum/go-ethereum/common"
  8. "github.com/ethereum/go-ethereum/ethclient"
  9. )
  10. func main() {
  11. client, err := ethclient.Dial("https://rinkeby.infura.io")
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. contractAddress := common.HexToAddress("0x147B8eb97fD247D06C4006D269c90C1908Fb5D54")
  16. bytecode, err := client.CodeAt(context.Background(), contractAddress, nil) // nil is latest block
  17. if err != nil {
  18. log.Fatal(err)
  19. }
  20. fmt.Println(hex.EncodeToString(bytecode)) // 60806...10029
  21. }