2020-10-20 20:33:18 +00:00
|
|
|
// VulcanizeDB
|
|
|
|
// Copyright © 2019 Vulcanize
|
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package eth_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
2022-12-13 13:25:30 +00:00
|
|
|
"fmt"
|
2020-10-20 20:33:18 +00:00
|
|
|
"io/ioutil"
|
|
|
|
"math/big"
|
2022-03-11 04:32:22 +00:00
|
|
|
"time"
|
2020-10-20 20:33:18 +00:00
|
|
|
|
2022-09-20 15:52:06 +00:00
|
|
|
"github.com/cerc-io/ipld-eth-server/v4/pkg/eth"
|
|
|
|
"github.com/cerc-io/ipld-eth-server/v4/pkg/eth/test_helpers"
|
|
|
|
"github.com/cerc-io/ipld-eth-server/v4/pkg/shared"
|
|
|
|
ethServerShared "github.com/cerc-io/ipld-eth-server/v4/pkg/shared"
|
2020-10-20 20:33:18 +00:00
|
|
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
|
|
"github.com/ethereum/go-ethereum/core"
|
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
|
"github.com/ethereum/go-ethereum/core/vm"
|
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
|
|
"github.com/ethereum/go-ethereum/statediff"
|
2021-08-12 06:23:41 +00:00
|
|
|
sdtypes "github.com/ethereum/go-ethereum/statediff/types"
|
2022-03-11 04:32:22 +00:00
|
|
|
"github.com/jmoiron/sqlx"
|
2020-10-20 20:33:18 +00:00
|
|
|
. "github.com/onsi/ginkgo"
|
|
|
|
. "github.com/onsi/gomega"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
parsedABI abi.ABI
|
2022-12-13 13:25:30 +00:00
|
|
|
|
|
|
|
stateRoot = common.HexToHash("0x572ef3b6b3d5164ed9d83341073f13af4d60a3aab38989b6c03917544f186a43")
|
|
|
|
rootDataHash = "572ef3b6b3d5164ed9d83341073f13af4d60a3aab38989b6c03917544f186a43"
|
|
|
|
rootData = "f8b1a0408dd81f6cd5c614f91ecd9faa01d5feba936e0314ba04f99c74069ba819e0f280808080a0b356351d60bc9894cf1f1d6cb68c815f0131d50f1da83c4023a09ec855cfff91a0180d554b171f6acf8295e376266df2311f68975d74c02753b85707d308f703e48080808080a0422c7cc4fa407603f0879a0ecaa809682ce98dbef30551a34bcce09fa3ac995180a02d264f591aa3fa9df3cbeea190a4fd8d5483ddfb1b85603b2a006d179f79ba358080"
|
|
|
|
|
|
|
|
account1DataHash = "180d554b171f6acf8295e376266df2311f68975d74c02753b85707d308f703e4"
|
|
|
|
account1Data = "f869a03114658a74d9cc9f7acf2c5cd696c3494d7c344d78bfec3add0d91ec4e8d1c45b846f8440180a04bd45c41d863f1bcf5da53364387fcdd64f77924d388a4df47e64132273fb4c0a0ba79854f3dbf6505fdbb085888e25fae8fa97288c5ce8fcd39aa589290d9a659"
|
|
|
|
account2DataHash = "2d264f591aa3fa9df3cbeea190a4fd8d5483ddfb1b85603b2a006d179f79ba35"
|
|
|
|
account2Data = "f871a03926db69aaced518e9b9f0f434a473e7174109c943548bb8f23be41ca76d9ad2b84ef84c02881bc16d674ec82710a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
|
|
|
account3DataHash = "408dd81f6cd5c614f91ecd9faa01d5feba936e0314ba04f99c74069ba819e0f2"
|
|
|
|
account3Data = "f86da030bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2ab84af848058405f5b608a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
|
|
|
account4DataHash = "422c7cc4fa407603f0879a0ecaa809682ce98dbef30551a34bcce09fa3ac9951"
|
|
|
|
account4Data = "f871a03957f3e2f04a0764c3a0491b175f69926da61efbcc8f61fa1455fd2d2b4cdd45b84ef84c80883782dace9d9003e8a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
|
|
|
account5DataHash = "b356351d60bc9894cf1f1d6cb68c815f0131d50f1da83c4023a09ec855cfff91"
|
|
|
|
account5Data = "f871a03380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312ab84ef84c80883782dace9d900000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
2020-10-20 20:33:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
// load abi
|
|
|
|
abiBytes, err := ioutil.ReadFile("./test_helpers/abi.json")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
parsedABI, err = abi.JSON(bytes.NewReader(abiBytes))
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-30 16:54:22 +00:00
|
|
|
var _ = Describe("eth state reading tests", func() {
|
2021-06-10 06:20:25 +00:00
|
|
|
const chainLength = 5
|
2020-10-20 20:33:18 +00:00
|
|
|
var (
|
2020-11-12 21:33:06 +00:00
|
|
|
blocks []*types.Block
|
|
|
|
receipts []types.Receipts
|
|
|
|
chain *core.BlockChain
|
2022-03-11 04:32:22 +00:00
|
|
|
db *sqlx.DB
|
2020-11-12 21:33:06 +00:00
|
|
|
api *eth.PublicEthAPI
|
|
|
|
backend *eth.Backend
|
|
|
|
chainConfig = params.TestChainConfig
|
|
|
|
mockTD = big.NewInt(1337)
|
|
|
|
expectedCanonicalHeader map[string]interface{}
|
2020-10-20 20:33:18 +00:00
|
|
|
)
|
2020-10-30 16:54:22 +00:00
|
|
|
It("test init", func() {
|
2020-10-20 20:33:18 +00:00
|
|
|
// db and type initializations
|
|
|
|
var err error
|
2022-03-17 10:48:18 +00:00
|
|
|
db = shared.SetupDB()
|
2022-03-21 06:11:34 +00:00
|
|
|
transformer := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash())
|
2021-10-07 09:35:11 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
backend, err = eth.NewEthBackend(db, ð.Config{
|
2020-10-20 20:33:18 +00:00
|
|
|
ChainConfig: chainConfig,
|
2021-09-21 12:10:55 +00:00
|
|
|
VMConfig: vm.Config{},
|
2021-06-09 18:50:12 +00:00
|
|
|
RPCGasCap: big.NewInt(10000000000), // Max gas capacity for a rpc call.
|
2021-09-21 12:10:55 +00:00
|
|
|
GroupCacheConfig: ðServerShared.GroupCacheConfig{
|
|
|
|
StateDB: ethServerShared.GroupConfig{
|
|
|
|
Name: "eth_state_test",
|
|
|
|
CacheSizeInMB: 8,
|
|
|
|
CacheExpiryInMins: 60,
|
|
|
|
LogStatsIntervalInSecs: 0,
|
|
|
|
},
|
2021-08-20 07:37:11 +00:00
|
|
|
},
|
2020-10-20 20:33:18 +00:00
|
|
|
})
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-12-30 02:29:59 +00:00
|
|
|
api, _ = eth.NewPublicEthAPI(backend, nil, false, false, false)
|
2020-10-20 20:33:18 +00:00
|
|
|
|
|
|
|
// make the test blockchain (and state)
|
2021-06-10 06:20:25 +00:00
|
|
|
blocks, receipts, chain = test_helpers.MakeChain(chainLength, test_helpers.Genesis, test_helpers.TestChainGen)
|
2020-10-30 16:54:22 +00:00
|
|
|
params := statediff.Params{
|
2020-10-20 20:33:18 +00:00
|
|
|
IntermediateStateNodes: true,
|
|
|
|
IntermediateStorageNodes: true,
|
|
|
|
}
|
2021-09-15 11:43:12 +00:00
|
|
|
canonicalHeader := blocks[1].Header()
|
2020-11-12 21:33:06 +00:00
|
|
|
expectedCanonicalHeader = map[string]interface{}{
|
|
|
|
"number": (*hexutil.Big)(canonicalHeader.Number),
|
|
|
|
"hash": canonicalHeader.Hash(),
|
|
|
|
"parentHash": canonicalHeader.ParentHash,
|
|
|
|
"nonce": canonicalHeader.Nonce,
|
|
|
|
"mixHash": canonicalHeader.MixDigest,
|
|
|
|
"sha3Uncles": canonicalHeader.UncleHash,
|
|
|
|
"logsBloom": canonicalHeader.Bloom,
|
|
|
|
"stateRoot": canonicalHeader.Root,
|
|
|
|
"miner": canonicalHeader.Coinbase,
|
|
|
|
"difficulty": (*hexutil.Big)(canonicalHeader.Difficulty),
|
|
|
|
"extraData": hexutil.Bytes([]byte{}),
|
|
|
|
"size": hexutil.Uint64(canonicalHeader.Size()),
|
|
|
|
"gasLimit": hexutil.Uint64(canonicalHeader.GasLimit),
|
|
|
|
"gasUsed": hexutil.Uint64(canonicalHeader.GasUsed),
|
|
|
|
"timestamp": hexutil.Uint64(canonicalHeader.Time),
|
|
|
|
"transactionsRoot": canonicalHeader.TxHash,
|
|
|
|
"receiptsRoot": canonicalHeader.ReceiptHash,
|
|
|
|
"totalDifficulty": (*hexutil.Big)(mockTD),
|
|
|
|
}
|
2020-10-20 20:33:18 +00:00
|
|
|
// iterate over the blocks, generating statediff payloads, and transforming the data into Postgres
|
2020-10-30 16:54:22 +00:00
|
|
|
builder := statediff.NewBuilder(chain.StateCache())
|
2020-10-20 20:33:18 +00:00
|
|
|
for i, block := range blocks {
|
|
|
|
var args statediff.Args
|
|
|
|
var rcts types.Receipts
|
|
|
|
if i == 0 {
|
|
|
|
args = statediff.Args{
|
|
|
|
OldStateRoot: common.Hash{},
|
|
|
|
NewStateRoot: block.Root(),
|
|
|
|
BlockNumber: block.Number(),
|
|
|
|
BlockHash: block.Hash(),
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
args = statediff.Args{
|
|
|
|
OldStateRoot: blocks[i-1].Root(),
|
|
|
|
NewStateRoot: block.Root(),
|
|
|
|
BlockNumber: block.Number(),
|
|
|
|
BlockHash: block.Hash(),
|
|
|
|
}
|
|
|
|
rcts = receipts[i-1]
|
|
|
|
}
|
2020-10-30 16:54:22 +00:00
|
|
|
diff, err := builder.BuildStateDiffObject(args, params)
|
2020-10-20 20:33:18 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-08-12 06:23:41 +00:00
|
|
|
tx, err := transformer.PushBlock(block, rcts, mockTD)
|
2020-10-20 20:33:18 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-08-12 06:23:41 +00:00
|
|
|
|
|
|
|
for _, node := range diff.Nodes {
|
2022-03-11 04:32:22 +00:00
|
|
|
err = transformer.PushStateNode(tx, node, block.Hash().String())
|
2021-08-12 06:23:41 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2020-10-20 20:33:18 +00:00
|
|
|
}
|
2022-03-11 04:32:22 +00:00
|
|
|
err = tx.Submit(err)
|
2020-10-20 20:33:18 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
}
|
2020-11-12 21:33:06 +00:00
|
|
|
|
|
|
|
// Insert some non-canonical data into the database so that we test our ability to discern canonicity
|
2022-03-21 06:11:34 +00:00
|
|
|
indexAndPublisher := shared.SetupTestStateDiffIndexer(ctx, chainConfig, test_helpers.Genesis.Hash())
|
2021-08-12 06:23:41 +00:00
|
|
|
|
|
|
|
tx, err := indexAndPublisher.PushBlock(test_helpers.MockBlock, test_helpers.MockReceipts, test_helpers.MockBlock.Difficulty())
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
2022-03-11 04:32:22 +00:00
|
|
|
err = tx.Submit(err)
|
2020-11-12 21:33:06 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-08-12 06:23:41 +00:00
|
|
|
|
2020-11-12 21:33:06 +00:00
|
|
|
// The non-canonical header has a child
|
2021-08-12 06:23:41 +00:00
|
|
|
tx, err = indexAndPublisher.PushBlock(test_helpers.MockChild, test_helpers.MockReceipts, test_helpers.MockChild.Difficulty())
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
|
|
|
hash := sdtypes.CodeAndCodeHash{
|
|
|
|
Hash: test_helpers.CodeHash,
|
|
|
|
Code: test_helpers.ContractCode,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = indexAndPublisher.PushCodeAndCodeHash(tx, hash)
|
2020-11-12 21:33:06 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-08-12 06:23:41 +00:00
|
|
|
|
2022-03-11 04:32:22 +00:00
|
|
|
// wait for tx batch process to complete.
|
2022-03-18 04:23:34 +00:00
|
|
|
time.Sleep(10000 * time.Millisecond)
|
2022-03-11 04:32:22 +00:00
|
|
|
err = tx.Submit(err)
|
2020-11-12 21:33:06 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2020-10-20 20:33:18 +00:00
|
|
|
})
|
2020-10-30 16:54:22 +00:00
|
|
|
defer It("test teardown", func() {
|
2022-03-17 10:48:18 +00:00
|
|
|
shared.TearDownDB(db)
|
2020-10-20 20:33:18 +00:00
|
|
|
chain.Stop()
|
|
|
|
})
|
2020-10-30 16:54:22 +00:00
|
|
|
|
2020-10-20 20:33:18 +00:00
|
|
|
Describe("eth_call", func() {
|
|
|
|
It("Applies call args (tx data) on top of state, returning the result (e.g. a Getter method call)", func() {
|
|
|
|
data, err := parsedABI.Pack("data")
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
bdata := hexutil.Bytes(data)
|
|
|
|
callArgs := eth.CallArgs{
|
|
|
|
To: &test_helpers.ContractAddr,
|
|
|
|
Data: &bdata,
|
|
|
|
}
|
2020-10-30 16:54:22 +00:00
|
|
|
// Before contract deployment, returns nil
|
2020-10-30 03:08:26 +00:00
|
|
|
res, err := api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(0), nil)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(res).To(BeNil())
|
|
|
|
|
|
|
|
res, err = api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(1), nil)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(res).To(BeNil())
|
|
|
|
|
|
|
|
// After deployment
|
|
|
|
res, err = api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(2), nil)
|
2020-10-20 20:33:18 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
expectedRes := hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
|
|
|
|
Expect(res).To(Equal(expectedRes))
|
|
|
|
|
|
|
|
res, err = api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(3), nil)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
expectedRes = hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000003"))
|
|
|
|
Expect(res).To(Equal(expectedRes))
|
|
|
|
|
|
|
|
res, err = api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(4), nil)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
expectedRes = hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000009"))
|
|
|
|
Expect(res).To(Equal(expectedRes))
|
2020-10-30 03:08:26 +00:00
|
|
|
|
|
|
|
res, err = api.Call(context.Background(), callArgs, rpc.BlockNumberOrHashWithNumber(5), nil)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
expectedRes = hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"))
|
|
|
|
Expect(res).To(Equal(expectedRes))
|
2020-10-20 20:33:18 +00:00
|
|
|
})
|
|
|
|
})
|
2020-10-30 16:54:22 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
var (
|
|
|
|
expectedContractBalance = (*hexutil.Big)(common.Big0)
|
|
|
|
expectedBankBalanceBlock0 = (*hexutil.Big)(test_helpers.TestBankFunds)
|
|
|
|
|
|
|
|
expectedAcct1BalanceBlock1 = (*hexutil.Big)(big.NewInt(10000))
|
|
|
|
expectedBankBalanceBlock1 = (*hexutil.Big)(new(big.Int).Sub(test_helpers.TestBankFunds, big.NewInt(10000)))
|
|
|
|
|
|
|
|
expectedAcct2BalanceBlock2 = (*hexutil.Big)(big.NewInt(1000))
|
|
|
|
expectedBankBalanceBlock2 = (*hexutil.Big)(new(big.Int).Sub(expectedBankBalanceBlock1.ToInt(), big.NewInt(1000)))
|
|
|
|
|
|
|
|
expectedAcct2BalanceBlock3 = (*hexutil.Big)(new(big.Int).Add(expectedAcct2BalanceBlock2.ToInt(), test_helpers.MiningReward))
|
|
|
|
|
|
|
|
expectedAcct2BalanceBlock4 = (*hexutil.Big)(new(big.Int).Add(expectedAcct2BalanceBlock3.ToInt(), test_helpers.MiningReward))
|
|
|
|
|
|
|
|
expectedAcct1BalanceBlock5 = (*hexutil.Big)(new(big.Int).Add(expectedAcct1BalanceBlock1.ToInt(), test_helpers.MiningReward))
|
|
|
|
)
|
|
|
|
|
|
|
|
Describe("eth_getBalance", func() {
|
|
|
|
It("Retrieves the eth balance for the provided account address at the block with the provided number", func() {
|
|
|
|
bal, err := api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock0))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(1))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(1))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(1))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(1))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock1))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(2))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(2))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock2))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(2))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(2))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(3))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(3))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock3))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(3))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(3))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(4))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(4))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock4))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(4))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(4))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(5))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock5))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(5))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock4))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(5))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithNumber(5))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
})
|
|
|
|
It("Retrieves the eth balance for the provided account address at the block with the provided hash", func() {
|
|
|
|
bal, err := api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock0))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
_, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true))
|
2021-06-03 16:49:48 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[1].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock1))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock2))
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[2].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock3))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock1))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock4))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[4].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct1BalanceBlock5))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedAcct2BalanceBlock4))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedContractBalance))
|
2021-06-03 16:49:48 +00:00
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.TestBankAddress, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal(expectedBankBalanceBlock2))
|
|
|
|
})
|
2021-06-03 16:49:48 +00:00
|
|
|
It("Returns `0` for an account it cannot find the balance for an account at the provided block number", func() {
|
|
|
|
bal, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
2020-10-30 17:14:26 +00:00
|
|
|
})
|
2021-06-03 16:49:48 +00:00
|
|
|
It("Returns `0` for an error for an account it cannot find the balance for an account at the provided block hash", func() {
|
|
|
|
bal, err := api.GetBalance(ctx, test_helpers.Account1Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.Account2Addr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
|
|
|
bal, err = api.GetBalance(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[0].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(bal).To(Equal((*hexutil.Big)(common.Big0)))
|
|
|
|
|
2020-10-30 17:14:26 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
Describe("eth_getCode", func() {
|
|
|
|
It("Retrieves the code for the provided contract address at the block with the provided number", func() {
|
|
|
|
code, err := api.GetCode(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(3))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(Equal((hexutil.Bytes)(test_helpers.ContractCode)))
|
|
|
|
|
|
|
|
code, err = api.GetCode(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(5))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(Equal((hexutil.Bytes)(test_helpers.ContractCode)))
|
|
|
|
})
|
|
|
|
It("Retrieves the code for the provided contract address at the block with the provided hash", func() {
|
|
|
|
code, err := api.GetCode(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(Equal((hexutil.Bytes)(test_helpers.ContractCode)))
|
|
|
|
|
|
|
|
code, err = api.GetCode(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithHash(blocks[5].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(Equal((hexutil.Bytes)(test_helpers.ContractCode)))
|
|
|
|
})
|
2021-04-21 12:11:00 +00:00
|
|
|
It("Returns `nil` for an account it cannot find the code for", func() {
|
|
|
|
code, err := api.GetCode(ctx, randomAddr, rpc.BlockNumberOrHashWithHash(blocks[3].Hash(), true))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(BeEmpty())
|
2020-10-30 17:14:26 +00:00
|
|
|
})
|
2021-04-21 12:11:00 +00:00
|
|
|
It("Returns `nil` for a contract that doesn't exist at this height", func() {
|
|
|
|
code, err := api.GetCode(ctx, test_helpers.ContractAddr, rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(code).To(BeEmpty())
|
2020-10-30 17:14:26 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2020-10-30 16:54:22 +00:00
|
|
|
Describe("eth_getStorageAt", func() {
|
2021-06-09 18:50:12 +00:00
|
|
|
It("Returns empty slice if it tries to access a contract which does not exist", func() {
|
|
|
|
storage, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.ContractSlotKeyHash.Hex(), rpc.BlockNumberOrHashWithNumber(0))
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2021-09-22 10:44:35 +00:00
|
|
|
Expect(storage).To(Equal(hexutil.Bytes(eth.EmptyNodeValue)))
|
2021-06-09 18:50:12 +00:00
|
|
|
|
|
|
|
storage, err = api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.ContractSlotKeyHash.Hex(), rpc.BlockNumberOrHashWithNumber(1))
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2021-09-22 10:44:35 +00:00
|
|
|
Expect(storage).To(Equal(hexutil.Bytes(eth.EmptyNodeValue)))
|
2020-10-30 16:54:22 +00:00
|
|
|
})
|
2021-06-09 18:50:12 +00:00
|
|
|
It("Returns empty slice if it tries to access a contract slot which does not exist", func() {
|
|
|
|
storage, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, randomHash.Hex(), rpc.BlockNumberOrHashWithNumber(2))
|
|
|
|
Expect(err).NotTo(HaveOccurred())
|
2021-09-22 10:44:35 +00:00
|
|
|
Expect(storage).To(Equal(hexutil.Bytes(eth.EmptyNodeValue)))
|
2020-10-30 16:54:22 +00:00
|
|
|
})
|
|
|
|
It("Retrieves the storage value at the provided contract address and storage leaf key at the block with the provided hash or number", func() {
|
|
|
|
// After deployment
|
2021-04-21 19:42:11 +00:00
|
|
|
val, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithNumber(2))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-04-21 19:42:11 +00:00
|
|
|
expectedRes := hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001"))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(val).To(Equal(expectedRes))
|
|
|
|
|
2021-04-21 19:42:11 +00:00
|
|
|
val, err = api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithNumber(3))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-04-21 19:42:11 +00:00
|
|
|
expectedRes = hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000003"))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(val).To(Equal(expectedRes))
|
|
|
|
|
2021-04-21 19:42:11 +00:00
|
|
|
val, err = api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithNumber(4))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-04-21 19:42:11 +00:00
|
|
|
expectedRes = hexutil.Bytes(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000009"))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(val).To(Equal(expectedRes))
|
|
|
|
|
2021-04-21 19:42:11 +00:00
|
|
|
val, err = api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithNumber(5))
|
2020-10-30 16:54:22 +00:00
|
|
|
Expect(err).ToNot(HaveOccurred())
|
2021-09-22 10:44:35 +00:00
|
|
|
Expect(val).To(Equal(hexutil.Bytes(eth.EmptyNodeValue)))
|
2020-10-30 16:54:22 +00:00
|
|
|
})
|
2021-06-10 06:20:25 +00:00
|
|
|
It("Throws an error for a non-existing block hash", func() {
|
|
|
|
_, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithHash(randomHash, true))
|
|
|
|
Expect(err).To(HaveOccurred())
|
|
|
|
Expect(err).To(MatchError("header for hash not found"))
|
|
|
|
})
|
|
|
|
It("Throws an error for a non-existing block number", func() {
|
|
|
|
_, err := api.GetStorageAt(ctx, test_helpers.ContractAddr, test_helpers.IndexOne, rpc.BlockNumberOrHashWithNumber(chainLength+1))
|
|
|
|
Expect(err).To(HaveOccurred())
|
|
|
|
Expect(err).To(MatchError("header not found"))
|
|
|
|
})
|
2020-10-30 16:54:22 +00:00
|
|
|
})
|
2020-11-12 21:33:06 +00:00
|
|
|
|
|
|
|
Describe("eth_getHeaderByNumber", func() {
|
|
|
|
It("Finds the canonical header based on the header's weight relative to others at the provided height", func() {
|
|
|
|
header, err := api.GetHeaderByNumber(ctx, number)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
Expect(header).To(Equal(expectedCanonicalHeader))
|
|
|
|
})
|
|
|
|
})
|
2022-12-13 13:25:30 +00:00
|
|
|
|
|
|
|
Describe("eth_getSlice", func() {
|
|
|
|
It("Retrieves the state nodes for root path", func() {
|
|
|
|
path := "0x"
|
|
|
|
depth := 3
|
|
|
|
sliceResponse, err := api.GetSlice(ctx, "0x", 3, stateRoot, false)
|
|
|
|
Expect(err).ToNot(HaveOccurred())
|
|
|
|
|
|
|
|
expectedResponse := eth.GetSliceResponse{
|
|
|
|
SliceID: fmt.Sprintf("%s-%d-%s", path, depth, stateRoot.String()),
|
|
|
|
MetaData: eth.GetSliceResponseMetadata{
|
|
|
|
NodeStats: map[string]string{
|
|
|
|
"00-stem-and-head-nodes": "1",
|
|
|
|
"01-max-depth": "1",
|
|
|
|
"02-total-trie-nodes": "6",
|
|
|
|
"03-leaves": "5",
|
|
|
|
"04-smart-contracts": "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
TrieNodes: eth.GetSliceResponseTrieNodes{
|
|
|
|
Stem: map[string]string{},
|
|
|
|
Head: map[string]string{
|
|
|
|
rootDataHash: rootData,
|
|
|
|
},
|
|
|
|
Slice: map[string]string{
|
|
|
|
account1DataHash: account1Data,
|
|
|
|
account2DataHash: account2Data,
|
|
|
|
account3DataHash: account3Data,
|
|
|
|
account4DataHash: account4Data,
|
|
|
|
account5DataHash: account5Data,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Leaves: map[string]eth.GetSliceResponseAccount{},
|
|
|
|
}
|
|
|
|
|
|
|
|
Expect(sliceResponse.SliceID).To(Equal(expectedResponse.SliceID))
|
|
|
|
Expect(sliceResponse.MetaData.NodeStats).To(Equal(expectedResponse.MetaData.NodeStats))
|
|
|
|
Expect(sliceResponse.TrieNodes).To(Equal(expectedResponse.TrieNodes))
|
|
|
|
Expect(sliceResponse.Leaves).To(Equal(expectedResponse.Leaves))
|
|
|
|
})
|
|
|
|
})
|
2020-10-20 20:33:18 +00:00
|
|
|
})
|