ホームページ  >  記事  >  バックエンド開発  >  golang イーサリアム転送

golang イーサリアム転送

PHPz
PHPzオリジナル
2023-05-14 14:06:381074ブラウズ

暗号通貨の人気に伴い、イーサリアムはビットコインに次いで最も人気のある暗号通貨の 1 つになりました。イーサリアムは、ユーザーが幅広いトランザクションやインタラクションを実行できるようにする強力なスマート コントラクト機能を備えたプラットフォームです。 Golang は高速でパフォーマンス効率の高いプログラミング言語であるため、イーサリアム トランザクションを処理するのに理想的な言語です。この記事では、Golangを使ってイーサリアム転送プログラムを書く方法を紹介します。

  1. Golang のインストール

Golang Ethereum 転送の作成を開始する前に、Golang がコンピュータにインストールされていることを確認する必要があります。 https://golang.org/dl/ にアクセスして、オペレーティング システム用の Golang インストーラーをダウンロードできます。

  1. Web3 ライブラリのインストール

Web3 は、Ethereum ノードと対話するためのインターフェイスを提供する JavaScript ライブラリです。これを使用して、イーサリアム トランザクションを送信したり、イーサリアム アカウントの残高を確認したりできます。

Golang で Web3 ライブラリを使用するには、golang.org/x/crypto/sha3 ライブラリを使用して、Ethereum トランザクションに関連付けられたハッシュを計算する必要があります。次のコマンドを使用して、両方のライブラリをインストールできます。

go get -u github.com/ethereum/go-ethereum

go get -u golang.org/x/crypto/sha3
  1. Ethereum ノードに接続

Ethereum トランザクションを送信する前に、Ethereum ノードに接続する必要があります。イーサリアム ノードはイーサリアム ブロックチェーンを実行するコンピューターであり、トランザクションの送信やブロックの高さのクエリなどのリクエストを送信することで通信できます。

Ethereum ノードの設定とコード実行環境に応じて、HTTP または IPC 経由で Ethereum ノードに接続できます。

次の例では、Ethereum パブリック ノードに接続します。次のコードを使用して Ethereum ノードに接続できます:

package main

import (
    "context"
    "fmt"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial("https://mainnet.infura.io")
    if err != nil {
        fmt.Println("Failed to connect to the Ethereum network: ", err)
        return
    }

    // Do something with the client...
}

このコードは Ethereum パブリック ノード (https://mainnet.infura.io) に接続し、ethclient.Client インスタンスを返します。 Ethereum ノードとの対話を使用します。

  1. トランザクションの作成

トランザクションを Ethereum に送信する前に、トランザクション パラメーターを設定する必要があります。最も重要なことは次のとおりです。

  • 送信者アドレス
  • 受信者アドレス
  • 送金額
  • ガス価格
  • ガス制限
#Gas は、イーサリアム ネットワークの計算コストの測定単位です。価格は、ガス単位あたりに支払ってもよいイーサの量です。制限は、トランザクションに対して支払うガスの最大量です。

次のコードを使用してトランザクションを作成できます:

// Sender and recipient addresses
fromAddress := common.HexToAddress("0xA97c32E990157aEbe7b14dD062a45C454a035B64")
toAddress := common.HexToAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")

// Amount to transfer
amount := big.NewInt(1000000000000000000) // 1 ETH

// Gas price and gas limit
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
    fmt.Println("Failed to get gas price: ", err)
    return
}
gasLimit := uint64(21000)

// Nonce
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
    fmt.Println("Failed to get nonce: ", err)
    return
}

// Create transaction
tx := types.NewTransaction(
    nonce,
    toAddress,
    amount,
    gasLimit,
    gasPrice,
    nil,
)

//TODO: Sign transaction

このコードでは、送信者アドレス、受信者アドレス、送金額、ガス価格、ガス制限、およびノンス (トランザクション シーケンス番号) を設定します。 )。

また、上記のデータを含む新しい署名されていないトランザクション (types.Transaction type) も作成します。ただし、トランザクションに署名する必要もあります。これにより、イーサリアム ノードは、トランザクションが送信者によって承認されたことを確認できるようになります。

    署名付きトランザクション
Ethereum では、トランザクションは秘密キーを使用して署名されます。秘密キーはイーサリアムアカウントのアドレスに対応しており、トランザクションに署名するには送信者の秘密キーを使用する必要があります。

秘密キーを使用してトランザクションに署名する方法は次のとおりです:

// Private key (32 byte slice)
privateKey := []byte{...}

// Sign transaction
signer := types.NewEIP155Signer(big.NewInt(1)) // Chain ID: 1 (Mainnet)
signedTx, err := types.SignTx(tx, signer, privateKey)
if err != nil {
    fmt.Println("Failed to sign transaction: ", err)
    return
}

このコードでは、types.SignTx 関数を使用して、送信者の秘密キーとともにトランザクションに署名します。また、この特定のコントラクトのチェーン ID も設定します (1 はイーサリアム メインネットを表します)。

ethclient.Client を使用して署名付きトランザクションを送信できるようになりました:

// Send signed transaction
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
    fmt.Println("Failed to send transaction: ", err)
    return
}

fmt.Printf("Transaction sent: %s
", signedTx.Hash().Hex())

    完全なコード例
  1. package main
    
    import (
        "context"
        "crypto/ecdsa"
        "fmt"
        "log"
        "math/big"
    
        "github.com/ethereum/go-ethereum/common"
        "github.com/ethereum/go-ethereum/crypto"
        "github.com/ethereum/go-ethereum/ethclient"
        "github.com/ethereum/go-ethereum/core/types"
    )
    
    func main() {
        client, err := ethclient.Dial("https://mainnet.infura.io")
        if err != nil {
            log.Fatalf("Failed to connect to the Ethereum network: %v", err)
        }
    
        // Sender and recipient addresses
        fromAddress := common.HexToAddress("0xA97c32E990157aEbe7b14dD062a45C454a035B64")
        toAddress := common.HexToAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")
    
        // Amount to transfer
        amount := big.NewInt(1000000000000000000) // 1 ETH
    
        // Gas price and gas limit
        gasPrice, err := client.SuggestGasPrice(context.Background())
        if err != nil {
            log.Fatalf("Failed to get gas price: %v", err)
        }
        gasLimit := uint64(21000)
    
        // Nonce
        nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
        if err != nil {
            log.Fatalf("Failed to get nonce: %v", err)
        }
    
        // Create transaction
        tx := types.NewTransaction(
            nonce,
            toAddress,
            amount,
            gasLimit,
            gasPrice,
            nil,
        )
    
        // Private key (32 byte slice)
        privateKey, err := crypto.HexToECDSA("YOUR_PRIVATE_KEY_HERE")
        if err != nil {
            log.Fatalf("Failed to get private key: %v", err)
        }
    
        // Sign transaction
        chainID, err := client.NetworkID(context.Background())
        if err != nil {
            log.Fatalf("Failed to get chain ID: %v", err)
        }
        signer := types.NewEIP155Signer(chainID)
        signedTx, err := types.SignTx(tx, signer, privateKey)
        if err != nil {
            log.Fatalf("Failed to sign transaction: %v", err)
        }
    
        // Send signed transaction
        err = client.SendTransaction(context.Background(), signedTx)
        if err != nil {
            log.Fatalf("Failed to send transaction: %v", err)
        }
    
        fmt.Printf("Transaction sent: %s
    ", signedTx.Hash().Hex())
    }
上記は Golang を使用して Ethereum 転送を作成しています。プログラムのプロセス全体。もちろん、秘密キーの管理やトランザクションの確認など、考慮する必要がある詳細やセキュリティの問題はさらにあります。

以上がgolang イーサリアム転送の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。