mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-25 21:07:18 +00:00
83179376d4
* Clean testutil, change tool names to Deterministic * Cleanup errors * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into clean-testutil * Fix bug with generating deposits * Fix a few tests * Fix most tests * Clean up some tests * Remove err pt. 1 * Remove err pt. 2 * Change tests to use genesis state util * Remove err from deposits * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Remove circular dependency * Remove uncompressed signature test * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil * Goimports * gazelle * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Add back error handling * New attestation pool (#4185) * New pool * Better namings * Fmt * Gazelle * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into define-pool * Raul's feedback * Raul's feedback * Log peer conected log for incoming connections (#4173) * Log peer conected log for incoming connections * Merge branch 'master' into peerconnected * Merge branch 'master' into peerconnected * Update handshake.go * Update handshake.go * Merge branch 'master' into peerconnected * Merge branch 'master' into peerconnected * Attestation pool to use go-cache (#4187) * Update EthereumAPIs (#4186) * include new patch targeting latest ethapis master * ensure project builds * Merge branch 'master' into update-all-api * fix up committees * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * include latest eth apis * Merge branch 'master' into update-all-api * update block tests * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * Merge branch 'master' into update-all-api * add todos * Implement GetValidator RPC Endpoint (#4188) * include new patch targeting latest ethapis master * ensure project builds * Merge branch 'master' into update-all-api * fix up committees * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * include latest eth apis * Merge branch 'master' into update-all-api * update block tests * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * Merge branch 'master' into update-all-api * add todos * implement get validator rpc * add test for get validator * table driven test * fix up test * fix confs * tests for more cases * fix up tests and add out of range * Slasher optimization (#4172) * size * batching and concurrency improvements * gaz * merge fixes * fix comment * fix test * fix test * fix build * ethpb * ethpb * fix test * fix comment * add benchmark * fix benchmark * Handle error for all testutil uses * Fix errors * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Revert error handling Revert "Fix errors" This reverts commit db081f5486f62c854e7a34e792f5e380cfa922e7. Revert "Handle error for all testutil uses" This reverts commit bdabef230632dd184491c2dad63c7d3e74a3861b. Revert "Add back error handling" This reverts commit da7e3d2020cd906f45f452d4e441b566f2d5c8aa. * Change genesis state func to use testing.T * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Fix conflict * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil * Merge branch 'master' into clean-testutil * Captialize other logs * Merge branch 'clean-testutil' of https://github.com/0xKiwi/Prysm into clean-testutil * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil
147 lines
4.0 KiB
Go
147 lines
4.0 KiB
Go
package endtoend
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/big"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bazelbuild/rules_go/go/tools/bazel"
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
contracts "github.com/prysmaticlabs/prysm/contracts/deposit-contract"
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
)
|
|
|
|
// startEth1 starts an eth1 local dev chain and deploys a deposit contract.
|
|
func startEth1(t *testing.T, tmpPath string) (common.Address, string, int) {
|
|
binaryPath, found := bazel.FindBinary("cmd/geth", "geth")
|
|
if !found {
|
|
t.Fatal("go-ethereum binary not found")
|
|
}
|
|
|
|
args := []string{
|
|
fmt.Sprintf("--datadir=%s", path.Join(tmpPath, "eth1data/")),
|
|
"--rpc",
|
|
"--rpcaddr=0.0.0.0",
|
|
"--rpccorsdomain=\"*\"",
|
|
"--rpcvhosts=\"*\"",
|
|
"--ws",
|
|
"--wsaddr=0.0.0.0",
|
|
"--wsorigins=\"*\"",
|
|
"--dev",
|
|
"--dev.period=0",
|
|
"--ipcdisable",
|
|
}
|
|
cmd := exec.Command(binaryPath, args...)
|
|
file, err := os.Create(path.Join(tmpPath, "eth1.log"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cmd.Stdout = file
|
|
cmd.Stderr = file
|
|
if err := cmd.Start(); err != nil {
|
|
t.Fatalf("Failed to start eth1 chain: %v", err)
|
|
}
|
|
|
|
if err = waitForTextInFile(file, "Commit new mining work"); err != nil {
|
|
t.Fatalf("mining log not found, this means the eth1 chain had issues starting: %v", err)
|
|
}
|
|
|
|
// Connect to the started geth dev chain.
|
|
client, err := rpc.DialHTTP("http://127.0.0.1:8545")
|
|
if err != nil {
|
|
t.Fatalf("Failed to connect to ipc: %v", err)
|
|
}
|
|
web3 := ethclient.NewClient(client)
|
|
|
|
// Access the dev account keystore to deploy the contract.
|
|
fileName, err := exec.Command("ls", path.Join(tmpPath, "eth1data/keystore")).Output()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
keystorePath := path.Join(tmpPath, fmt.Sprintf("eth1data/keystore/%s", strings.TrimSpace(string(fileName))))
|
|
jsonBytes, err := ioutil.ReadFile(keystorePath)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
keystore, err := keystore.DecryptKey(jsonBytes, "" /*password*/)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Advancing the blocks eth1follow distance to prevent issues reading the chain.
|
|
if err := mineBlocks(web3, keystore, params.BeaconConfig().Eth1FollowDistance); err != nil {
|
|
t.Fatalf("Unable to advance chain: %v", err)
|
|
}
|
|
|
|
txOpts, err := bind.NewTransactor(bytes.NewReader(jsonBytes), "" /*password*/)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
nonce, err := web3.PendingNonceAt(context.Background(), keystore.Address)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
txOpts.Nonce = big.NewInt(int64(nonce))
|
|
contractAddr, tx, _, err := contracts.DeployDepositContract(txOpts, web3, txOpts.From)
|
|
if err != nil {
|
|
t.Fatalf("Failed to deploy deposit contract: %v", err)
|
|
}
|
|
|
|
// Wait for contract to mine.
|
|
for pending := true; pending; _, pending, err = web3.TransactionByHash(context.Background(), tx.Hash()) {
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
time.Sleep(100 * time.Millisecond)
|
|
}
|
|
|
|
return contractAddr, keystorePath, cmd.Process.Pid
|
|
}
|
|
|
|
func mineBlocks(web3 *ethclient.Client, keystore *keystore.Key, blocksToMake uint64) error {
|
|
nonce, err := web3.PendingNonceAt(context.Background(), keystore.Address)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
chainID, err := web3.NetworkID(context.Background())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
block, err := web3.BlockByNumber(context.Background(), nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
finishBlock := block.NumberU64() + blocksToMake
|
|
|
|
for block.NumberU64() <= finishBlock {
|
|
spamTX := types.NewTransaction(nonce, keystore.Address, big.NewInt(0), 21000, big.NewInt(1e6), []byte{})
|
|
signed, err := types.SignTx(spamTX, types.NewEIP155Signer(chainID), keystore.PrivateKey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := web3.SendTransaction(context.Background(), signed); err != nil {
|
|
return err
|
|
}
|
|
nonce++
|
|
time.Sleep(250 * time.Microsecond)
|
|
block, err = web3.BlockByNumber(context.Background(), nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|