暗号通貨の人気に伴い、イーサリアムはビットコインに次いで最も人気のある暗号通貨の 1 つになりました。イーサリアムは、ユーザーが幅広いトランザクションやインタラクションを実行できるようにする強力なスマート コントラクト機能を備えたプラットフォームです。 Golang は高速でパフォーマンス効率の高いプログラミング言語であるため、イーサリアム トランザクションを処理するのに理想的な言語です。この記事では、Golangを使ってイーサリアム転送プログラムを書く方法を紹介します。
Golang Ethereum 転送の作成を開始する前に、Golang がコンピュータにインストールされていることを確認する必要があります。 https://golang.org/dl/ にアクセスして、オペレーティング システム用の Golang インストーラーをダウンロードできます。
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
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 ノードとの対話を使用します。
トランザクションを Ethereum に送信する前に、トランザクション パラメーターを設定する必要があります。最も重要なことは次のとおりです。
// 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) も作成します。ただし、トランザクションに署名する必要もあります。これにより、イーサリアム ノードは、トランザクションが送信者によって承認されたことを確認できるようになります。
// 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())
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 イーサリアム転送の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。