韩国av不卡_日本美女久久久_少妇88av_国产黑丝在线视频_色花堂视频_天天想夜夜爽

幣圈網

Go語言與以太坊智能合約交互,實戰指南

隨著區塊鏈技術的飛速發展,以太坊作為智能合約平臺的領軍者,吸引了大量開發者的關注,Go語言(Golang)憑借其簡潔的語法、高效的并發性能和強大的標準庫,在區塊鏈領域,特別是節點開發、工具構建等方面得到了廣泛應用,將Go語言與以太坊智能合約相結合,可以實現強大的去中心化應用(DApp)后端邏輯或自動化交互工具,本文將詳細介紹如何使用Go語言調用以太坊智能合約,涵蓋環境搭建、合約部署、交互方法及最佳實踐。

準備工作:開發環境與依賴

在開始之前,我們需要確保以下環境和工具已經準備就緒:

  1. Go語言環境:安裝Go(建議版本1.16或更高),并配置好GOPATHGOROOT
  2. 以太坊節點
    • 本地節點:可以運行一個本地以太坊節點,如Geth(Go Ethereum)或Parity,這對于開發和測試非常方便。
    • 遠程節點/Infura:使用Infura等提供的遠程節點服務,無需自己維護節點,適合快速開發和測試。
    • Testnet/Mainnet:在測試網(如Ropsten, Goerli)或主網上進行真實交互時,需要確保節點已同步,并擁有足夠的ETH用于支付Gas費用。
  3. 智能合約:一個已經編寫、編譯并部署到以太坊網絡上的智能合約,我們將使用Solidity編寫的合約,并通過solc(Solidity編譯器)編譯得到ABI(Application Binary Interface)和字節碼(Bytecode)。
  4. Go以太坊庫:最核心的依賴是go-ethereum庫,它提供了與以太坊節點交互的完整功能,我們可以通過以下命令安裝:
    go get -u github.com/ethereum/go-ethereum
    go get -u github.com/ethereum/go-ethereum/crypto
    go get -u github.com/ethereum/go-ethereum/accounts/abi
    go get -u github.com/ethereum/go-ethereum/accounts/abi/bind
    go get -u github.com/ethereum/go-ethereum/common
    go get -u github.com/ethereum/go-ethereum/ethclient

連接以太坊節點

使用Go與以太坊交互的第一步是連接到以太坊節點,這通常通過ethclient包實現。

package main
import (
    "context"
    "fmt"
    "log"
    "github.com/ethereum/go-ethereum/ethclient"
)
func main() {
    // 替換為你的節點地址,可以是本地節點(如 "http://localhost:8545")或Infura地址
    nodeURL := "https://ropsten.infura.io/v3/YOUR_INFURA_PROJECT_ID"
    client, err := ethclient.Dial(nodeURL)
    if err != nil {
        log.Fatalf("Failed to connect to the Ethereum client: %v", err)
    }
    defer client.Close()
    // 驗證連接
    blockNumber, err := client.BlockNumber(context.Background())
    if err != nil {
        log.Fatalf("Failed to get block number: %v", err)
    }
    fmt.Println("Connected to Ethereum client. Latest block number:", blockNumber)
}

準備智能合約ABI

ABI是智能合約與外界交互的接口,定義了函數的輸入參數、輸出參數以及事件等,我們需要編譯Solidity合約得到ABI(通常是一個JSON字符串)。

假設我們有一個簡單的存儲合約SimpleStorage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
    uint256 private storedData;
    function set(uint256 x) public {
        storedData = x;
    }
    function get() public view returns (uint256) {
        return storedData;
    }
}

使用solc編譯后,我們可以得到ABI,在實際Go代碼中,我們可以將ABI JSON字符串直接定義,或者從文件讀取。

// 假設這是SimpleStorage.sol編譯后的ABI(簡化版)
const simpleStorageABI = `[{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`

合約實例化

有了合約地址和ABI,我們就可以在Go中創建合約的實例。common.NewAddress用于將字符串地址轉換為以太坊地址類型。

package main
import (
    "context"
    "fmt"
    "log"
    "math/big"
    "github.com/ethereum/go-ethereum/accounts/abi"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
)
const simpleStorageABI = `[{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]`
const simpleStorageAddress = "0x1234567890123456789012345678901234567890" // 替換為你的合約部署地址
func main() {
    client, err := ethclient.Dial("https://ropsten.infura.io/v3/YOUR_INFURA_PROJECT_ID")
    if err != nil {
        log.Fatalf("Failed to connect to the Ethereum client: %v", err)
    }
    defer client.Close()
    parsedABI, err := abi.JSON(strings.NewReader(simpleStorageABI))
    if err != nil {
        log.Fatalf("Failed to parse ABI: %v", err)
    }
    contractAddress := common.HexToAddress(simpleStorageAddress)
    contractInstance := bind.NewBoundContract(contractAddress, parsedABI, client, client, client)
}

調用合約常量/視圖函數(讀操作)

對于viewpure函數,它們不會修改區塊鏈狀態,因此可以直接調用而無需發送交易。

get()函數為例:

// ... 前面的代碼 ...
// 調用get()函數
var result *big.Int
err = contractInstance.Call(nil, &result, "get")
if err != nil {
    log.Fatalf("Failed to call get function: %v", err)
}
fmt.Println("Stored value:", result)

Call方法的第一個參數是callOpts,對于讀操作通常傳nil,第三個參數是函數名,后續參數是對應的輸入參數。

發送交易調用合約修改函數(寫操作)

對于會修改區塊鏈狀態的函數(如set()),我們需要發送交易,這需要擁有足夠的ETH支付Gas,并指定發送者(transactor)。

// ... 前面的代碼 ...
// 準備發送者賬戶
privateKey, err := crypto.HexToECDSA("YOUR_PRIVATE_KEY_WITHOUT_0X") // 替換為你的私鑰
if err != nil {
    log.Fatalf("Failed to parse private key: %v", err)
}
publicKey := privateKey.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
    log.Fatalf("Error casting public key to ECDSA: %v", err)
}
fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
    log.Fatalf("Failed to get nonce: %v", err)
}
// 設置GasPrice和GasLimit
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
    log.Fatalf("Failed to suggest gas price: %v", err)
}
gasLimit := uint64(300000) // 根據合約函數復雜度調整
// 準備交易值
value := big.NewInt(0) // 通常為0,除非是 payable 函數
newData := big.NewInt(42) // 要設置的值
// 創建交易
tx, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(3)) // 3 是 Ropsten 測試網的 chainID
if err != nil {
    log.Fatalf("Failed to create transactor: %v", err)
}
tx.Nonce = big.NewInt(int64(nonce))
tx.GasLimit = gasLimit
tx.GasPrice = gasPrice
tx.Value = value
tx.To = &contractAddress
// 調用 set 函數并發送交易
var txHash common.Hash
err = contractInstance.Transact(tx, &txHash, "set", newData)
if err != nil {
    log.Fatalf("Failed to transact set function: %v", err)
}
fmt.Printf("Transaction sent! Hash: %s\n", txHash.Hex())
// 等待交易被打包
receipt,

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 深夜成人福利 | 亚洲a毛片 | 欧美日韩在线免费观看 | 男操女免费视频 | 一级黄色片网址 | 91人人澡 | 国产一区二区视频在线播放 | 欧美色综合网 | 自拍偷拍视频在线观看 | 成人免费播放视频 | 亚洲精品一线 | 丰满岳乱妇一区二区 | 免费欧美日韩 | 欧美日韩另类视频 | 男女视频一区 | 亚洲精品播放 | 四虎成人影视 | 青青视频在线免费观看 | 亚洲欧美精品在线观看 | 五月天婷婷综合网 | 大地资源在线资源 | 久久国产精品无码网站 | 九九热精品在线观看 | 黄视频免费看在线 | av视屏| 深夜福利成人 | 亚洲欧美日韩激情 | 五月婷中文字幕 | 九九九九精品 | 老牛影视av牛牛影视av | 91禁男男在线观看 | 国产不卡在线观看 | 成人在线观看www | 欧美一区二区三区不卡 | av激情网 | 永久免费av网站 | 欧美成人免费在线 | 操极品美女 | 91日日 | 国产黄色免费大片 | 欧美手机在线观看 |