Go语言开发以太坊:智能合约地址检测

本节将介绍如何验证地址并确定其是否为智能合约地址。

检查地址是否有效

我们可以使用一个简单的正则表达式来检查以太坊地址是否有效:

re := regexp.MustCompile("^0x[0-9a-fA-F]{40}$")fmt.Printf("is valid: %v\n", re.MatchString("0x323b5d4c32345ced77393b3530b1eed0f346429d")) // is valid: truefmt.Printf("is valid: %v\n", re.MatchString("0xZYXb5d4c32345ced77393b3530b1eed0f346429d")) // is valid: false

检查地址是否在帐户或智能合约中

如果在该地址存储了字节码,我们可以确定该地址是否为智能合约这是一个示例,其中我们获取智能合约的代码,并检查其长度以确认它是智能合约

// 0x Protocol Token (ZRX) smart contract addressaddress := common.HexToAddress("0xe41d2489571d322189246dafa5ebde1f4699f498")bytecode, err := client.CodeAt(context.Background(), address, nil) // nil is latest blockif err != nil {
  log.Fatal(err)}isContract := len(bytecode) > 0fmt.Printf("is contract: %v\n", isContract) // is contract: true

如果地址中没有字节码,那么我们知道这不是一个智能合约,而是一个标准的以太坊账户:

// a random user account addressaddress := common.HexToAddress("0x8e215d06ea7ec1fdb4fc5fd21768f4b34ee92ef4")bytecode, err := client.CodeAt(context.Background(), address, nil) // nil is latest blockif err != nil {
  log.Fatal(err)}isContract = len(bytecode) > 0fmt.Printf("is contract: %v\n", isContract) // is contract: false

完整代码

address_check.go

package mainimport (    "context"
    "fmt"
    "log"
    "regexp"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient")func main() {
    re := regexp.MustCompile("^0x[0-9a-fA-F]{40}$")
    fmt.Printf("is valid: %v\n", re.MatchString("0x323b5d4c32345ced77393b3530b1eed0f346429d")) // is valid: true
    fmt.Printf("is valid: %v\n", re.MatchString("0xZYXb5d4c32345ced77393b3530b1eed0f346429d")) // is valid: false
    client, err := ethclient.Dial("https://mainnet.infura.io")    if err != nil {
        log.Fatal(err)
    }
    // 0x Protocol Token (ZRX) smart contract address
    address := common.HexToAddress("0xe41d2489571d322189246dafa5ebde1f4699f498")
    bytecode, err := client.CodeAt(context.Background(), address, nil) // nil is latest block
    if err != nil {
        log.Fatal(err)
    }
    isContract := len(bytecode) > 0
    fmt.Printf("is contract: %v\n", isContract) // is contract: true
    // a random user account address
    address = common.HexToAddress("0x8e215d06ea7ec1fdb4fc5fd21768f4b34ee92ef4")
    bytecode, err = client.CodeAt(context.Background(), address, nil) // nil is latest block
    if err != nil {
        log.Fatal(err)
    }
    isContract = len(bytecode) > 0
    fmt.Printf("is contract: %v\n", isContract) // is contract: false}


链客

2019.11.27
4737
收藏

个评论:

发表评论

感谢您的善举,每一次解答会成为新人的灯塔。回答被采纳后获得20算力和相应LK币奖励。

关闭