Goでイーサー坊開発⑦テスト

5293 ワード

すいせん


蛇口は無料でテストネットでETHを取得する方法です.
ここには各試験網の蛇口が羅列されている.
  • Ropsten testnet - https://faucet.ropsten.be
  • Rinkeby testnet - https://faucet.rinkeby.io
  • Kovan testnet - https://gitter.im/kovan-testnet/faucet
  • Sokol testnet - https://faucet-sokol.herokuapp.com

  • シミュレーションクライアントの使用


    シミュレーションクライアントを使用すると、トランザクションをローカルで簡単にテストできます.ユニットテストに適しています.最初に、初期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 }

    小編微信を追加:grey 0805、知識学習小分隊に参加~!