---
概述: 用Go檢查地址是智能合約或賬戶的教程。
---
# 地址檢查
本節將介紹如何確認一個地址并確定其是否為智能合約地址。
## 檢查地址是否有效
我們可以使用簡單的正則表達式來檢查以太坊地址是否有效:
We can use a simple regular expression to check if the ethereum address is valid:
```go
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
```
## 檢查地址是否為賬戶或智能合約
我們可以確定,若在該地址存儲了字節碼,該地址是智能合約。這是一個示例,在例子中,我們獲取一個代幣智能合約的字節碼并檢查其長度以驗證它是一個智能合約:
```go
// 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
```
當地址上沒有字節碼時,我們知道它不是一個智能合約,它是一個標準的以太坊賬戶。
```go
// 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
```
---
### 完整代碼
```go
package main
import (
"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
}
```
- 客戶端
- 創建客戶端
- 以太坊賬戶
- 賬戶余額
- 賬戶代幣余額
- 生成新錢包
- 密匙庫
- 硬件錢包
- 地址驗證
- 交易
- 查詢區塊
- 查詢交易
- ETH轉賬
- 代幣轉賬
- 監聽新區塊
- 創建裸交易
- 發送裸交易
- 智能合約
- 智能合約 & ABI
- 部署智能合約
- 加載智能合約
- 查詢智能合約
- 寫入智能合約
- 讀取智能合約二進制碼
- 查詢ERC20代幣智能合約
- 事件日志
- 監聽事件日志
- 讀取時間日志
- 讀取ERC20代幣的事件日志
- 讀取0x Protocol事件日志
- 簽名
- 生成簽名
- 驗證簽名
- 測試
- 發幣龍頭
- 使用模擬客戶端
- Swarm存儲
- 創建 Swarm存儲
- 上傳文件到Swarm
- 從Swarm下載文件
- Whisper通信協議
- 創建Whisper客戶端
- 生成Whisper密匙對
- 在Whisper上發送消息
- 監聽Whisper消息
- 工具
- 工具集合
- 專有詞匯表
- 資源