Goでイーサー坊開発⑦テスト
5293 ワード
すいせん
蛇口は無料でテストネットでETHを取得する方法です.
ここには各試験網の蛇口が羅列されている.
シミュレーションクライアントの使用
シミュレーションクライアントを使用すると、トランザクションをローカルで簡単にテストできます.ユニットテストに適しています.最初に、初期ETH付きの口座が必要です.このため、まずアカウント秘密鍵を生成します.
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatal(err)
}
次いで、
accounts/abi/bind
パケットからNewKeyedTransactor
が作成され、秘密鍵が渡される.auth := bind.NewKeyedTransactor(privateKey)
次のステップは、創世口座を作成し、初期残高を割り当てます.
core
パックのGenesisAccount
タイプを使用します.balance := new(big.Int)
balance.SetString("10000000000000000000", 10) // 10 eth in wei
address := auth.From
genesisAlloc := map[common.Address]core.GenesisAccount{
address: {
Balance: balance,
},
}
次に,創世分配構造体と配置されたガソリン上限を
account/abi/bind/backends
パケットのNewSimulatedBackend
メソッドに伝達し,このメソッドは新しいシミュレーションイーサ坊クライアントに戻る.blockGasLimit := uint64(4712388)
client := backends.NewSimulatedBackend(genesisAlloc, blockGasLimit)
このクライアントは、通常のように使用できます.一例として,新しい取引を構築し,ブロードキャストを行う.
fromAddress := auth.From
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
log.Fatal(err)
}
value := big.NewInt(1000000000000000000) // in wei (1 eth)
gasLimit := uint64(21000) // in units
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
log.Fatal(err)
}
toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d")
var data []byte
tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)
chainID := big.NewInt(1)
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)
if err != nil {
log.Fatal(err)
}
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("tx sent: %s
", signedTx.Hash().Hex()) // tx sent: 0xec3ceb05642c61d33fa6c951b54080d1953ac8227be81e7b5e4e2cfed69eeb51
これまで、取引がいつ採掘されるか知りたいかもしれません.「採掘」のためには、クライアント呼び出し
Commit
で新しい採掘ブロックを提出する追加のこともしなければなりません.client.Commit()
取引領収書を取得し、処理されていることがわかります.
receipt, err := client.TransactionReceipt(context.Background(), signedTx.Hash())
if err != nil {
log.Fatal(err)
}
if receipt == nil {
log.Fatal("receipt is nil. Forgot to commit?")
}
fmt.Printf("status: %v
", receipt.Status) // status: 1
したがって、シミュレーションクライアントでは、シミュレーションクライアントの
Commit
メソッドを使用してブロックを手動で採掘できます.完全なコード
client_simulated.go
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
)
func main() {
privateKey, err := crypto.GenerateKey()
if err != nil {
log.Fatal(err)
}
auth := bind.NewKeyedTransactor(privateKey)
balance := new(big.Int)
balance.SetString("10000000000000000000", 10) // 10 eth in wei
address := auth.From
genesisAlloc := map[common.Address]core.GenesisAccount{
address: {
Balance: balance,
},
}
blockGasLimit := uint64(4712388)
client := backends.NewSimulatedBackend(genesisAlloc, blockGasLimit)
fromAddress := auth.From
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
log.Fatal(err)
}
value := big.NewInt(1000000000000000000) // in wei (1 eth)
gasLimit := uint64(21000) // in units
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
log.Fatal(err)
}
toAddress := common.HexToAddress("0x4592d8f8d7b001e72cb26a73e4fa1806a51ac79d")
var data []byte
tx := types.NewTransaction(nonce, toAddress, value, gasLimit, gasPrice, data)
chainID := big.NewInt(1)
signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey)
if err != nil {
log.Fatal(err)
}
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("tx sent: %s
", signedTx.Hash().Hex()) // tx sent: 0xec3ceb05642c61d33fa6c951b54080d1953ac8227be81e7b5e4e2cfed69eeb51
client.Commit()
receipt, err := client.TransactionReceipt(context.Background(), signedTx.Hash())
if err != nil {
log.Fatal(err)
}
if receipt == nil {
log.Fatal("receipt is nil. Forgot to commit?")
}
fmt.Printf("status: %v
", receipt.Status) // status: 1
}