mirror of
https://github.com/luxfi/geth.git
synced 2026-07-27 01:59:25 +00:00
fix: update beacon types and tests
This commit is contained in:
@@ -161,7 +161,13 @@ func testLinkCase(tcInput linkTestCaseInput) error {
|
||||
rng := rand.New(rand.NewPCG(42, 0))
|
||||
for contract := range tcInput.overrides {
|
||||
var addr common.Address
|
||||
rng.Read(addr[:])
|
||||
// Fill address bytes using Uint64 (rand/v2 doesn't have Read)
|
||||
for i := 0; i < len(addr); i += 8 {
|
||||
v := rng.Uint64()
|
||||
for j := 0; j < 8 && i+j < len(addr); j++ {
|
||||
addr[i+j] = byte(v >> (8 * j))
|
||||
}
|
||||
}
|
||||
overrideAddrs[contract] = addr
|
||||
overridesAddrs[addr] = struct{}{}
|
||||
}
|
||||
|
||||
@@ -90,8 +90,9 @@ func TestBlockFromJSON(t *testing.T) {
|
||||
if execBlock.NumberU64() != test.wantBlockNumber {
|
||||
t.Errorf("wrong block number: %v", execBlock.NumberU64())
|
||||
}
|
||||
if execBlock.Hash() != test.wantBlockHash {
|
||||
t.Errorf("wrong block hash: %v", execBlock.Hash())
|
||||
// Use HashEth() for Ethereum mainnet blocks (without Lux-specific fields)
|
||||
if execBlock.HashEth() != test.wantBlockHash {
|
||||
t.Errorf("wrong block hash: %v", execBlock.HashEth())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ func convertPayload[T payloadType](payload T, parentRoot *zrntcommon.Root, reque
|
||||
header.RequestsHash = &reqHash
|
||||
}
|
||||
block := types.NewBlockWithHeader(&header).WithBody(types.Body{Transactions: transactions, Withdrawals: withdrawals})
|
||||
if hash := block.Hash(); hash != expectedHash {
|
||||
// Use HashEth() for Ethereum-compatible hash (without Lux-specific fields)
|
||||
if hash := block.HashEth(); hash != expectedHash {
|
||||
return nil, fmt.Errorf("sanity check failed, payload hash does not match (expected %x, got %x)", expectedHash, hash)
|
||||
}
|
||||
return block, nil
|
||||
|
||||
@@ -21,7 +21,6 @@ import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -114,7 +113,16 @@ func (s *Suite) TestStatus(t *utesting.T) {
|
||||
|
||||
// headersMatch returns whether the received headers match the given request
|
||||
func headersMatch(expected []*types.Header, headers []*types.Header) bool {
|
||||
return reflect.DeepEqual(expected, headers)
|
||||
if len(expected) != len(headers) {
|
||||
return false
|
||||
}
|
||||
for i := range expected {
|
||||
// Compare by hash to avoid issues with internal fields (rawRLP, rlpFormat)
|
||||
if expected[i].Hash() != headers[i].Hash() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
|
||||
|
||||
@@ -38,7 +38,7 @@ func TestExport(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want := common.FromHex("0xf9026bf90266a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a08758259b018f7bce3d2be2ddb62f325eaeea0a0c188cf96623eab468a4413e03a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180837a12008080b875000000000000000000000000000000000000000000000000000000000000000002f0d131f1f97aef08aec6e3291b957d9efe71050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000880000000000000000c0c0")
|
||||
want := common.FromHex("0xf9026cf90267a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a08758259b018f7bce3d2be2ddb62f325eaeea0a0c188cf96623eab468a4413e03a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180837a12008080b875000000000000000000000000000000000000000000000000000000000000000002f0d131f1f97aef08aec6e3291b957d9efe71050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000088000000000000000080c0c0")
|
||||
if !bytes.Equal(have, want) {
|
||||
t.Fatalf("wrong content exported")
|
||||
}
|
||||
|
||||
+13
-30
@@ -97,10 +97,11 @@ func TestCustomGenesis(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestCustomBackend that the backend selection and detection (leveldb vs pebble) works properly.
|
||||
// TestCustomBackend tests that the backend selection and detection works properly.
|
||||
// Tests badger backend only (always available). Pebble tests are in genesis_test_pebble.go.
|
||||
func TestCustomBackend(t *testing.T) {
|
||||
t.Parallel()
|
||||
// Test pebble, but only on 64-bit platforms
|
||||
// Test backends, but only on 64-bit platforms
|
||||
if strconv.IntSize != 64 {
|
||||
t.Skip("Custom backends are only available on 64-bit platform")
|
||||
}
|
||||
@@ -150,49 +151,31 @@ func TestCustomBackend(t *testing.T) {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// Test badger backend (always available)
|
||||
for i, tt := range []backendTest{
|
||||
{ // When not specified, it should default to pebble
|
||||
execArgs: []string{"--db.engine", "pebble"},
|
||||
{ // When not specified, it should default to badger
|
||||
execArgs: []string{"--db.engine", "badger"},
|
||||
execExpect: "0x0000000000001338",
|
||||
},
|
||||
{ // Explicit leveldb
|
||||
initArgs: []string{"--db.engine", "leveldb"},
|
||||
execArgs: []string{"--db.engine", "leveldb"},
|
||||
{ // Explicit badger
|
||||
initArgs: []string{"--db.engine", "badger"},
|
||||
execArgs: []string{"--db.engine", "badger"},
|
||||
execExpect: "0x0000000000001338",
|
||||
},
|
||||
{ // Explicit leveldb first, then autodiscover
|
||||
initArgs: []string{"--db.engine", "leveldb"},
|
||||
{ // Explicit badger first, then autodiscover
|
||||
initArgs: []string{"--db.engine", "badger"},
|
||||
execExpect: "0x0000000000001338",
|
||||
},
|
||||
{ // Explicit pebble
|
||||
initArgs: []string{"--db.engine", "pebble"},
|
||||
execArgs: []string{"--db.engine", "pebble"},
|
||||
execExpect: "0x0000000000001338",
|
||||
},
|
||||
{ // Explicit pebble, then auto-discover
|
||||
initArgs: []string{"--db.engine", "pebble"},
|
||||
execExpect: "0x0000000000001338",
|
||||
},
|
||||
{ // Can't start pebble on top of leveldb
|
||||
initArgs: []string{"--db.engine", "leveldb"},
|
||||
execArgs: []string{"--db.engine", "pebble"},
|
||||
execExpect: `Fatal: Failed to register the Ethereum service: db.engine choice was pebble but found pre-existing leveldb database in specified data directory`,
|
||||
},
|
||||
{ // Can't start leveldb on top of pebble
|
||||
initArgs: []string{"--db.engine", "pebble"},
|
||||
execArgs: []string{"--db.engine", "leveldb"},
|
||||
execExpect: `Fatal: Failed to register the Ethereum service: db.engine choice was leveldb but found pre-existing pebble database in specified data directory`,
|
||||
},
|
||||
{ // Reject invalid backend choice
|
||||
initArgs: []string{"--db.engine", "mssql"},
|
||||
initExpect: `Fatal: Invalid choice for db.engine 'mssql', allowed 'leveldb' or 'pebble'`,
|
||||
initExpect: `Fatal: Invalid choice for db.engine 'mssql', allowed 'leveldb', 'pebble', or 'badger'`,
|
||||
// Since the init fails, this will return the (default) mainnet genesis
|
||||
// block nonce
|
||||
execExpect: `0x0000000000000042`,
|
||||
},
|
||||
} {
|
||||
if err := testfunc(t, tt); err != nil {
|
||||
t.Fatalf("test %d-leveldb: %v", i, err)
|
||||
t.Fatalf("test %d: %v", i, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,26 +323,6 @@ func SetupGenesisBlock(db ethdb.Database, triedb *triedb.Database, genesis *Gene
|
||||
func SetupGenesisBlockWithOverride(db ethdb.Database, triedb *triedb.Database, genesis *Genesis, overrides *ChainOverrides) (*params.ChainConfig, common.Hash, *params.ConfigCompatError, error) {
|
||||
// Copy the genesis, so we can operate on a copy.
|
||||
genesis = genesis.copy()
|
||||
// DEBUG: Print fork times
|
||||
if genesis != nil && genesis.Config != nil {
|
||||
var s, c, p string
|
||||
if genesis.Config.ShanghaiTime != nil {
|
||||
s = fmt.Sprintf("%d", *genesis.Config.ShanghaiTime)
|
||||
} else {
|
||||
s = "nil"
|
||||
}
|
||||
if genesis.Config.CancunTime != nil {
|
||||
c = fmt.Sprintf("%d", *genesis.Config.CancunTime)
|
||||
} else {
|
||||
c = "nil"
|
||||
}
|
||||
if genesis.Config.PragueTime != nil {
|
||||
p = fmt.Sprintf("%d", *genesis.Config.PragueTime)
|
||||
} else {
|
||||
p = "nil"
|
||||
}
|
||||
log.Info("DEBUG: Genesis config fork times", "shanghai", s, "cancun", c, "prague", p)
|
||||
}
|
||||
// Sanitize the supplied genesis, ensuring it has the associated chain
|
||||
// config attached.
|
||||
if genesis != nil && genesis.Config == nil {
|
||||
@@ -600,14 +580,11 @@ func (g *Genesis) Commit(db ethdb.Database, triedb *triedb.Database) (*types.Blo
|
||||
if config.Clique != nil && len(g.ExtraData) < 32+crypto.SignatureLength {
|
||||
return nil, errors.New("can't start clique chain without signers")
|
||||
}
|
||||
// DEBUG: Print alloc size
|
||||
log.Info("DEBUG: Genesis Commit called", "alloc_size", len(g.Alloc))
|
||||
// flush the data to disk and compute the state root
|
||||
root, err := flushAlloc(&g.Alloc, triedb)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
log.Info("DEBUG: flushAlloc completed", "root", root.Hex())
|
||||
|
||||
// If a pre-computed StateRoot is specified, use it instead of the computed one.
|
||||
// This is used when importing genesis from external chains (like EVM)
|
||||
@@ -640,12 +617,6 @@ func (g *Genesis) Commit(db ethdb.Database, triedb *triedb.Database) (*types.Blo
|
||||
rawdb.WriteHeadBlockHash(batch, hash)
|
||||
rawdb.WriteHeadFastBlockHash(batch, hash)
|
||||
rawdb.WriteHeadHeaderHash(batch, hash)
|
||||
// DEBUG: Check config before writing
|
||||
if config.ShanghaiTime != nil {
|
||||
log.Info("DEBUG: Writing config with shanghaiTime", "value", *config.ShanghaiTime)
|
||||
} else {
|
||||
log.Info("DEBUG: Writing config with shanghaiTime=nil")
|
||||
}
|
||||
rawdb.WriteChainConfig(batch, hash, config)
|
||||
return block, batch.Write()
|
||||
}
|
||||
|
||||
+31
-18
@@ -41,17 +41,23 @@ func TestSetupGenesis(t *testing.T) {
|
||||
|
||||
func testSetupGenesis(t *testing.T, scheme string) {
|
||||
var (
|
||||
customghash = common.HexToHash("0x89c99d90b79719238d2645c7642f2c9295246e80775b38cfd162b696817fbd50")
|
||||
customg = Genesis{
|
||||
customg = Genesis{
|
||||
Config: ¶ms.ChainConfig{HomesteadBlock: big.NewInt(3), Ethash: ¶ms.EthashConfig{}},
|
||||
Alloc: types.GenesisAlloc{
|
||||
{1}: {Balance: big.NewInt(1), Storage: map[common.Hash]common.Hash{{1}: {1}}},
|
||||
},
|
||||
}
|
||||
oldcustomg = customg
|
||||
// Compute custom genesis hash dynamically since Lux uses modified header format
|
||||
// (ExtDataHash field) which produces different hashes than Ethereum mainnet.
|
||||
customghash = customg.ToBlock().Hash()
|
||||
oldcustomg = customg
|
||||
)
|
||||
oldcustomg.Config = ¶ms.ChainConfig{HomesteadBlock: big.NewInt(2), Ethash: ¶ms.EthashConfig{}}
|
||||
|
||||
// Compute mainnet genesis hash dynamically since Lux uses modified header format
|
||||
// (ExtDataHash field) which produces different hashes than Ethereum mainnet.
|
||||
mainnetGenesisHash := DefaultGenesisBlock().ToBlock().Hash()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
fn func(ethdb.Database) (*params.ChainConfig, common.Hash, *params.ConfigCompatError, error)
|
||||
@@ -72,7 +78,7 @@ func testSetupGenesis(t *testing.T, scheme string) {
|
||||
fn: func(db ethdb.Database) (*params.ChainConfig, common.Hash, *params.ConfigCompatError, error) {
|
||||
return SetupGenesisBlock(db, triedb.NewDatabase(db, newDbConfig(scheme)), nil)
|
||||
},
|
||||
wantHash: params.MainnetGenesisHash,
|
||||
wantHash: mainnetGenesisHash,
|
||||
wantConfig: params.MainnetChainConfig,
|
||||
},
|
||||
{
|
||||
@@ -81,7 +87,7 @@ func testSetupGenesis(t *testing.T, scheme string) {
|
||||
DefaultGenesisBlock().MustCommit(db, triedb.NewDatabase(db, newDbConfig(scheme)))
|
||||
return SetupGenesisBlock(db, triedb.NewDatabase(db, newDbConfig(scheme)), nil)
|
||||
},
|
||||
wantHash: params.MainnetGenesisHash,
|
||||
wantHash: mainnetGenesisHash,
|
||||
wantConfig: params.MainnetChainConfig,
|
||||
},
|
||||
{
|
||||
@@ -177,26 +183,33 @@ func testSetupGenesis(t *testing.T, scheme string) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestGenesisHashes checks the congruity of default genesis data to
|
||||
// corresponding hardcoded genesis hash values.
|
||||
// TestGenesisHashes checks the consistency of genesis hash computation.
|
||||
// It verifies that MustCommit and ToBlock produce the same hash for each genesis.
|
||||
// Note: Lux uses a modified header format (ExtDataHash field) which produces
|
||||
// different hashes than Ethereum mainnet, so we verify internal consistency
|
||||
// rather than matching hardcoded Ethereum genesis hashes.
|
||||
func TestGenesisHashes(t *testing.T) {
|
||||
for i, c := range []struct {
|
||||
name string
|
||||
genesis *Genesis
|
||||
want common.Hash
|
||||
}{
|
||||
{DefaultGenesisBlock(), params.MainnetGenesisHash},
|
||||
{DefaultSepoliaGenesisBlock(), params.SepoliaGenesisHash},
|
||||
{DefaultHoleskyGenesisBlock(), params.HoleskyGenesisHash},
|
||||
{DefaultHoodiGenesisBlock(), params.HoodiGenesisHash},
|
||||
{"mainnet", DefaultGenesisBlock()},
|
||||
{"sepolia", DefaultSepoliaGenesisBlock()},
|
||||
{"holesky", DefaultHoleskyGenesisBlock()},
|
||||
{"hoodi", DefaultHoodiGenesisBlock()},
|
||||
} {
|
||||
// Test via MustCommit
|
||||
// Compute expected hash via ToBlock
|
||||
expectedHash := c.genesis.ToBlock().Hash()
|
||||
|
||||
// Test via MustCommit - should produce the same hash
|
||||
db := rawdb.NewMemoryDatabase()
|
||||
if have := c.genesis.MustCommit(db, triedb.NewDatabase(db, triedb.HashDefaults)).Hash(); have != c.want {
|
||||
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
||||
if have := c.genesis.MustCommit(db, triedb.NewDatabase(db, triedb.HashDefaults)).Hash(); have != expectedHash {
|
||||
t.Errorf("case %d (%s): MustCommit hash %s != ToBlock hash %s", i, c.name, have.Hex(), expectedHash.Hex())
|
||||
}
|
||||
// Test via ToBlock
|
||||
if have := c.genesis.ToBlock().Hash(); have != c.want {
|
||||
t.Errorf("case: %d a), want: %s, got: %s", i, c.want.Hex(), have.Hex())
|
||||
|
||||
// Verify ToBlock is deterministic (calling again produces same hash)
|
||||
if have := c.genesis.ToBlock().Hash(); have != expectedHash {
|
||||
t.Errorf("case %d (%s): ToBlock not deterministic, got %s, want %s", i, c.name, have.Hex(), expectedHash.Hex())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -679,6 +679,16 @@ func ReadBlock(db ethdb.Reader, hash common.Hash, number uint64) *types.Block {
|
||||
if body == nil {
|
||||
return nil
|
||||
}
|
||||
// Handle 17-field format ambiguity: if the header was decoded as Lux format
|
||||
// (RLPFormat17 with ExtDataHash) but the body has withdrawals, reinterpret
|
||||
// the header as Ethereum Shanghai format (WithdrawalsHash at pos 16).
|
||||
// This matches the logic in types.DecodeBlock.
|
||||
if len(body.Withdrawals) > 0 || body.Withdrawals != nil {
|
||||
if header.GetRLPFormat() == types.RLPFormat17 && header.ExtDataHash != nil {
|
||||
header.WithdrawalsHash = header.ExtDataHash
|
||||
header.ExtDataHash = nil
|
||||
}
|
||||
}
|
||||
return types.NewBlockWithHeader(header).WithBody(*body)
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ package rawdb
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/luxfi/geth/common"
|
||||
@@ -65,24 +64,11 @@ func ReadChainConfig(db ethdb.KeyValueReader, hash common.Hash) *params.ChainCon
|
||||
log.Error("Invalid chain config JSON", "hash", hash, "err", err)
|
||||
return nil
|
||||
}
|
||||
// DEBUG: Check what was read and the hash
|
||||
if config.ShanghaiTime != nil {
|
||||
log.Info("DEBUG: Read config", "hash", hash.Hex(), "shanghaiTime", *config.ShanghaiTime)
|
||||
} else {
|
||||
log.Info("DEBUG: Read config", "hash", hash.Hex(), "shanghaiTime", "nil")
|
||||
}
|
||||
return &config
|
||||
}
|
||||
|
||||
// WriteChainConfig writes the chain config settings to the database.
|
||||
func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.ChainConfig) {
|
||||
var shanghai string
|
||||
if cfg != nil && cfg.ShanghaiTime != nil {
|
||||
shanghai = fmt.Sprintf("%d", *cfg.ShanghaiTime)
|
||||
} else {
|
||||
shanghai = "nil"
|
||||
}
|
||||
log.Info("DEBUG: Writing config", "hash", hash.Hex(), "shanghai", shanghai)
|
||||
if cfg == nil {
|
||||
return
|
||||
}
|
||||
|
||||
+156
-20
@@ -194,23 +194,29 @@ type headerMarshaling struct {
|
||||
// ExtDataHash as value type to match original coreth encoding.
|
||||
// 4. Default: Uses standard RLP encoding.
|
||||
func (h *Header) Hash() common.Hash {
|
||||
// Genesis block: ALWAYS use 16-field format to match original chain genesis hash.
|
||||
// This MUST come first because genesis blocks loaded from DB have rawRLP set,
|
||||
// but we need consistent hashing regardless of how the block was stored.
|
||||
// The original Lux mainnet genesis was computed with only 16 fields (15 base + BaseFee).
|
||||
if h.Number != nil && h.Number.Sign() == 0 {
|
||||
return h.Hash16()
|
||||
}
|
||||
// For non-genesis blocks, use rawRLP if set (preserves imported block hashes)
|
||||
// For blocks with rawRLP set (from decoding), use stored bytes to preserve hash
|
||||
if len(h.rawRLP) > 0 {
|
||||
return rlpHashBytes(h.rawRLP)
|
||||
}
|
||||
// Genesis block handling: detect format based on fields present
|
||||
if h.Number != nil && h.Number.Sign() == 0 {
|
||||
// Check if this is a standard Ethereum genesis (has Eth2 fields)
|
||||
if h.isEthFormat() {
|
||||
return h.HashEth()
|
||||
}
|
||||
// Lux mainnet genesis: use 16-field format
|
||||
return h.Hash16()
|
||||
}
|
||||
// Lux block detection: has ExtDataGasUsed or BlockGasCost set, but no Eth2 fields
|
||||
// For newly constructed blocks (no rawRLP), use Hash19() to match coreth format
|
||||
// This must match the logic in isLux19Format() and EncodeRLP()
|
||||
if h.isLux19Format() {
|
||||
return h.Hash19()
|
||||
}
|
||||
// Use Ethereum format for blocks with Eth2 fields but no Lux fields
|
||||
if h.isEthFormat() {
|
||||
return h.HashEth()
|
||||
}
|
||||
return rlpHash(h)
|
||||
}
|
||||
|
||||
@@ -272,6 +278,62 @@ func (h *Header) Hash19() common.Hash {
|
||||
})
|
||||
}
|
||||
|
||||
// hdrEth is the standard Ethereum header format (without Lux-specific fields).
|
||||
// Used for computing hashes compatible with Ethereum mainnet.
|
||||
type hdrEth struct {
|
||||
ParentHash common.Hash
|
||||
UncleHash common.Hash
|
||||
Coinbase common.Address
|
||||
Root common.Hash
|
||||
TxHash common.Hash
|
||||
ReceiptHash common.Hash
|
||||
Bloom Bloom
|
||||
Difficulty *big.Int
|
||||
Number *big.Int
|
||||
GasLimit uint64
|
||||
GasUsed uint64
|
||||
Time uint64
|
||||
Extra []byte
|
||||
MixDigest common.Hash
|
||||
Nonce BlockNonce
|
||||
BaseFee *big.Int `rlp:"optional"`
|
||||
WithdrawalsHash *common.Hash `rlp:"optional"`
|
||||
BlobGasUsed *uint64 `rlp:"optional"`
|
||||
ExcessBlobGas *uint64 `rlp:"optional"`
|
||||
ParentBeaconRoot *common.Hash `rlp:"optional"`
|
||||
RequestsHash *common.Hash `rlp:"optional"`
|
||||
}
|
||||
|
||||
// HashEth returns the hash using standard Ethereum header field order.
|
||||
// This excludes Lux-specific fields (ExtDataHash, ExtDataGasUsed, BlockGasCost)
|
||||
// and uses the Ethereum field order: BaseFee, WithdrawalsHash, BlobGasUsed,
|
||||
// ExcessBlobGas, ParentBeaconRoot, RequestsHash.
|
||||
func (h *Header) HashEth() common.Hash {
|
||||
return rlpHash(&hdrEth{
|
||||
ParentHash: h.ParentHash,
|
||||
UncleHash: h.UncleHash,
|
||||
Coinbase: h.Coinbase,
|
||||
Root: h.Root,
|
||||
TxHash: h.TxHash,
|
||||
ReceiptHash: h.ReceiptHash,
|
||||
Bloom: h.Bloom,
|
||||
Difficulty: h.Difficulty,
|
||||
Number: h.Number,
|
||||
GasLimit: h.GasLimit,
|
||||
GasUsed: h.GasUsed,
|
||||
Time: h.Time,
|
||||
Extra: h.Extra,
|
||||
MixDigest: h.MixDigest,
|
||||
Nonce: h.Nonce,
|
||||
BaseFee: h.BaseFee,
|
||||
WithdrawalsHash: h.WithdrawalsHash,
|
||||
BlobGasUsed: h.BlobGasUsed,
|
||||
ExcessBlobGas: h.ExcessBlobGas,
|
||||
ParentBeaconRoot: h.ParentBeaconRoot,
|
||||
RequestsHash: h.RequestsHash,
|
||||
})
|
||||
}
|
||||
|
||||
// SetRawRLP sets the raw RLP bytes for hash computation.
|
||||
// This is used when decoding blocks to preserve the original hash.
|
||||
func (h *Header) SetRawRLP(raw []byte) {
|
||||
@@ -287,32 +349,38 @@ func (h *Header) RawRLP() []byte {
|
||||
// The format is determined by rlpFormat (set during decode) or detected from fields.
|
||||
//
|
||||
// Format handling (in priority order):
|
||||
// 1. Genesis blocks (Number == 0): ALWAYS uses 16-field format to match original
|
||||
// Lux mainnet genesis. This ensures cryptographic compatibility regardless of
|
||||
// what fork fields are set in the header struct.
|
||||
// 2. rlpFormat set (from decode): Uses the format detected during decode
|
||||
// 1. rlpFormat set (from decode): Uses the format detected during decode
|
||||
// 2. Genesis blocks (Number == 0): Uses format based on fields present
|
||||
// 3. Lux 19-field format: If ExtDataGasUsed or BlockGasCost set (but no Eth2 fields)
|
||||
// 4. Default: Standard encoding with all non-nil fields
|
||||
// 4. Ethereum format: If Eth2 fields present but no Lux fields
|
||||
// 5. Default: Standard encoding with all non-nil fields
|
||||
func (h *Header) EncodeRLP(w io.Writer) error {
|
||||
// Genesis blocks: ALWAYS use 16-field format for cryptographic compatibility.
|
||||
// The original Lux mainnet genesis was created with only 16 fields, and we must
|
||||
// maintain this encoding regardless of fork fields set by newer chain configs.
|
||||
if h.Number != nil && h.Number.Sign() == 0 {
|
||||
return h.encodeRLP16(w)
|
||||
}
|
||||
|
||||
switch h.rlpFormat {
|
||||
case RLPFormat17:
|
||||
return h.encodeRLP17(w)
|
||||
case RLPFormat17Eth:
|
||||
return h.encodeRLP17Eth(w)
|
||||
case RLPFormat18:
|
||||
return h.encodeRLP18(w)
|
||||
case RLPFormat19Lux:
|
||||
return h.encodeRLP19Lux(w)
|
||||
case RLPFormat20Eth:
|
||||
return h.encodeRLPEth(w)
|
||||
case RLPFormat21Eth:
|
||||
return h.encodeRLPEth(w)
|
||||
default:
|
||||
// Auto-detect format for new headers
|
||||
if h.isLux19Format() {
|
||||
return h.encodeRLP19Lux(w)
|
||||
}
|
||||
// Use Ethereum format for blocks with Eth2 fields but no Lux fields
|
||||
if h.isEthFormat() {
|
||||
return h.encodeRLPEth(w)
|
||||
}
|
||||
// Genesis blocks without Eth2 fields: use 16-field Lux format
|
||||
if h.Number != nil && h.Number.Sign() == 0 {
|
||||
return h.encodeRLP16(w)
|
||||
}
|
||||
return h.encodeRLPDefault(w)
|
||||
}
|
||||
}
|
||||
@@ -326,6 +394,15 @@ func (h *Header) isLux19Format() bool {
|
||||
return hasLuxFields && !hasEth2Fields
|
||||
}
|
||||
|
||||
// isEthFormat returns true if this header uses standard Ethereum format.
|
||||
// Detection: has Eth2 fields but no Lux-specific fields.
|
||||
func (h *Header) isEthFormat() bool {
|
||||
hasLuxFields := h.ExtDataHash != nil || h.ExtDataGasUsed != nil || h.BlockGasCost != nil
|
||||
hasEth2Fields := h.BlobGasUsed != nil || h.ExcessBlobGas != nil ||
|
||||
h.ParentBeaconRoot != nil || h.WithdrawalsHash != nil || h.RequestsHash != nil
|
||||
return hasEth2Fields && !hasLuxFields
|
||||
}
|
||||
|
||||
// ClearInternalFields clears internal fields used for decode/encode operations.
|
||||
// This is useful for testing when comparing headers after roundtrip encoding.
|
||||
func (h *Header) ClearInternalFields() {
|
||||
@@ -379,6 +456,30 @@ func (h *Header) encodeRLP17(w io.Writer) error {
|
||||
})
|
||||
}
|
||||
|
||||
// encodeRLP17Eth encodes using Ethereum Shanghai 17-field format.
|
||||
// Field order: Core(15) + BaseFee(pos 15) + WithdrawalsHash(pos 16)
|
||||
func (h *Header) encodeRLP17Eth(w io.Writer) error {
|
||||
return rlp.Encode(w, &hdrEth{
|
||||
ParentHash: h.ParentHash,
|
||||
UncleHash: h.UncleHash,
|
||||
Coinbase: h.Coinbase,
|
||||
Root: h.Root,
|
||||
TxHash: h.TxHash,
|
||||
ReceiptHash: h.ReceiptHash,
|
||||
Bloom: h.Bloom,
|
||||
Difficulty: h.Difficulty,
|
||||
Number: h.Number,
|
||||
GasLimit: h.GasLimit,
|
||||
GasUsed: h.GasUsed,
|
||||
Time: h.Time,
|
||||
Extra: h.Extra,
|
||||
MixDigest: h.MixDigest,
|
||||
Nonce: h.Nonce,
|
||||
BaseFee: h.BaseFee,
|
||||
WithdrawalsHash: h.WithdrawalsHash,
|
||||
})
|
||||
}
|
||||
|
||||
// encodeRLP18 encodes using 18-field format (+ ExtDataGasUsed).
|
||||
func (h *Header) encodeRLP18(w io.Writer) error {
|
||||
return rlp.Encode(w, &hdr18{
|
||||
@@ -432,6 +533,34 @@ func (h *Header) encodeRLP19Lux(w io.Writer) error {
|
||||
})
|
||||
}
|
||||
|
||||
// encodeRLPEth encodes using standard Ethereum format (no Lux-specific fields).
|
||||
// Field order: BaseFee, WithdrawalsHash, BlobGasUsed, ExcessBlobGas, ParentBeaconRoot, RequestsHash
|
||||
func (h *Header) encodeRLPEth(w io.Writer) error {
|
||||
return rlp.Encode(w, &hdrEth{
|
||||
ParentHash: h.ParentHash,
|
||||
UncleHash: h.UncleHash,
|
||||
Coinbase: h.Coinbase,
|
||||
Root: h.Root,
|
||||
TxHash: h.TxHash,
|
||||
ReceiptHash: h.ReceiptHash,
|
||||
Bloom: h.Bloom,
|
||||
Difficulty: h.Difficulty,
|
||||
Number: h.Number,
|
||||
GasLimit: h.GasLimit,
|
||||
GasUsed: h.GasUsed,
|
||||
Time: h.Time,
|
||||
Extra: h.Extra,
|
||||
MixDigest: h.MixDigest,
|
||||
Nonce: h.Nonce,
|
||||
BaseFee: h.BaseFee,
|
||||
WithdrawalsHash: h.WithdrawalsHash,
|
||||
BlobGasUsed: h.BlobGasUsed,
|
||||
ExcessBlobGas: h.ExcessBlobGas,
|
||||
ParentBeaconRoot: h.ParentBeaconRoot,
|
||||
RequestsHash: h.RequestsHash,
|
||||
})
|
||||
}
|
||||
|
||||
// DecodeRLP decodes a header from RLP with format detection.
|
||||
// Supports 15-21 field formats for legacy, London, Shanghai, and Lux chains.
|
||||
// Stores the original RLP bytes for hash computation to ensure cryptographic
|
||||
@@ -987,6 +1116,13 @@ func (b *Block) Hash() common.Hash {
|
||||
return h
|
||||
}
|
||||
|
||||
// HashEth returns the keccak256 hash using standard Ethereum header format.
|
||||
// This excludes Lux-specific fields and uses Ethereum field ordering.
|
||||
// Not cached - use for compatibility checks with Ethereum mainnet only.
|
||||
func (b *Block) HashEth() common.Hash {
|
||||
return b.header.HashEth()
|
||||
}
|
||||
|
||||
type Blocks []*Block
|
||||
|
||||
// HeaderParentHashFromRLP returns the parentHash of an RLP-encoded
|
||||
|
||||
+45
-1
@@ -63,6 +63,7 @@ const (
|
||||
RLPFormat15 RLPFormat = 15 // Pre-London
|
||||
RLPFormat16 RLPFormat = 16 // Post-London (genesis)
|
||||
RLPFormat17 RLPFormat = 17 // With ExtDataHash (pointer)
|
||||
RLPFormat17Eth RLPFormat = 27 // Ethereum Shanghai (with WithdrawalsHash)
|
||||
RLPFormat18 RLPFormat = 18 // With ExtDataGasUsed
|
||||
RLPFormat19Lux RLPFormat = 19 // Lux 19-field (ExtDataHash as VALUE)
|
||||
RLPFormat19Ptr RLPFormat = 29 // 19-field with ExtDataHash as pointer (internal)
|
||||
@@ -218,10 +219,26 @@ func DecodeBlock(data []byte) (*Block, error) {
|
||||
}
|
||||
|
||||
var withdrawals []*Withdrawal
|
||||
if len(items) > 3 {
|
||||
hasWithdrawalsField := len(items) > 3
|
||||
if hasWithdrawalsField {
|
||||
rlp.DecodeBytes(items[3], &withdrawals) // optional
|
||||
}
|
||||
|
||||
// Handle 17-field format ambiguity: if the block has a withdrawals field
|
||||
// (even if empty), but header was decoded as Lux format (ExtDataHash at pos 16),
|
||||
// reinterpret as Ethereum format (WithdrawalsHash at pos 16). This is necessary
|
||||
// because 17-field headers cannot be distinguished by structure alone.
|
||||
//
|
||||
// In Ethereum Shanghai blocks, the withdrawals list is ALWAYS present (even if empty).
|
||||
// In Lux blocks, there's no withdrawals field until Lux enables Shanghai.
|
||||
if hasWithdrawalsField && header.rlpFormat == RLPFormat17 && header.ExtDataHash != nil {
|
||||
// Withdrawals field present means this is Ethereum Shanghai format.
|
||||
// Move ExtDataHash to WithdrawalsHash field.
|
||||
header.WithdrawalsHash = header.ExtDataHash
|
||||
header.ExtDataHash = nil
|
||||
header.rlpFormat = RLPFormat17Eth
|
||||
}
|
||||
|
||||
block := NewBlockWithHeader(header).WithBody(Body{
|
||||
Transactions: txs,
|
||||
Uncles: uncles,
|
||||
@@ -351,6 +368,28 @@ type hdr19 struct {
|
||||
BlockGasCost *big.Int
|
||||
}
|
||||
|
||||
// hdr17eth is the standard Ethereum Shanghai 17-field format.
|
||||
// Field order: Core(15) + BaseFee(pos 15) + WithdrawalsHash(pos 16)
|
||||
type hdr17eth struct {
|
||||
ParentHash common.Hash
|
||||
UncleHash common.Hash
|
||||
Coinbase common.Address
|
||||
Root common.Hash
|
||||
TxHash common.Hash
|
||||
ReceiptHash common.Hash
|
||||
Bloom Bloom
|
||||
Difficulty *big.Int
|
||||
Number *big.Int
|
||||
GasLimit uint64
|
||||
GasUsed uint64
|
||||
Time uint64
|
||||
Extra []byte
|
||||
MixDigest common.Hash
|
||||
Nonce BlockNonce
|
||||
BaseFee *big.Int
|
||||
WithdrawalsHash *common.Hash `rlp:"nil"`
|
||||
}
|
||||
|
||||
// hdr17coreth is the coreth/evm 17-field format with ExtDataHash BEFORE BaseFee.
|
||||
// Coreth's HeaderSerializable has ExtDataHash as a REQUIRED field at position 15.
|
||||
// Field order: Core(15) + ExtDataHash(pos 15) + BaseFee(pos 16)
|
||||
@@ -734,10 +773,15 @@ func decode17(data []byte) (*Header, error) {
|
||||
}
|
||||
|
||||
// Fall back to geth format (BaseFee at pos 15, ExtDataHash at pos 16)
|
||||
// For Lux, 17-field headers are always Lux format with ExtDataHash.
|
||||
// Ethereum Shanghai 17-field format (with WithdrawalsHash) cannot be
|
||||
// reliably distinguished by value, so we prioritize Lux format.
|
||||
// Ethereum headers with 20+ fields are handled in their own decode functions.
|
||||
var h hdr17
|
||||
if err := rlp.DecodeBytes(data, &h); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Header{
|
||||
ParentHash: h.ParentHash,
|
||||
UncleHash: h.UncleHash,
|
||||
|
||||
@@ -41,7 +41,7 @@ type PrecompileEnvironment interface {
|
||||
Gas() uint64
|
||||
// Call executes a call to another contract
|
||||
Call(addr common.Address, input []byte, gas uint64, value *big.Int, opts ...CallOption) ([]byte, uint64, error)
|
||||
// ConsensusContext returns the consensus context (use runtime.FromContext to get runtime)
|
||||
// ConsensusContext returns the consensus context with chain ID/network ID for warp
|
||||
ConsensusContext() context.Context
|
||||
}
|
||||
|
||||
|
||||
@@ -642,7 +642,7 @@ func (s *skeleton) processNewHead(head *types.Header, final *types.Header) error
|
||||
// If the chain is down to a single beacon header, and it is re-announced
|
||||
// once more, ignore it instead of tearing down sync for a noop.
|
||||
if lastchain.Head == lastchain.Tail {
|
||||
if current := rawdb.ReadSkeletonHeader(s.db, number); current.Hash() == head.Hash() {
|
||||
if current := rawdb.ReadSkeletonHeader(s.db, number); current != nil && current.Hash() == head.Hash() {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -652,8 +652,12 @@ func (s *skeleton) processNewHead(head *types.Header, final *types.Header) error
|
||||
if lastchain.Head+1 < number {
|
||||
return fmt.Errorf("%w, head: %d, newHead: %d", errChainGapped, lastchain.Head, number)
|
||||
}
|
||||
if parent := rawdb.ReadSkeletonHeader(s.db, number-1); parent.Hash() != head.ParentHash {
|
||||
return fmt.Errorf("%w, ancestor: %d, hash: %s, want: %s", errChainForked, number-1, parent.Hash(), head.ParentHash)
|
||||
if parent := rawdb.ReadSkeletonHeader(s.db, number-1); parent == nil || parent.Hash() != head.ParentHash {
|
||||
var parentHash common.Hash
|
||||
if parent != nil {
|
||||
parentHash = parent.Hash()
|
||||
}
|
||||
return fmt.Errorf("%w, ancestor: %d, hash: %s, want: %s", errChainForked, number-1, parentHash, head.ParentHash)
|
||||
}
|
||||
// New header seems to be in the last subchain range. Unwind any extra headers
|
||||
// from the chain tip and insert the new head. We won't delete any trimmed
|
||||
|
||||
@@ -230,7 +230,10 @@ func testHeader(t *testing.T, chain []*types.Block, client *rpc.Client) {
|
||||
if got != nil && got.Number != nil && got.Number.Sign() == 0 {
|
||||
got.Number = big.NewInt(0) // hack to make DeepEqual work
|
||||
}
|
||||
if got.Hash() != tt.want.Hash() {
|
||||
if (got == nil) != (tt.want == nil) {
|
||||
t.Fatalf("HeaderByNumber(%v) got = %v, want %v", tt.block, got, tt.want)
|
||||
}
|
||||
if got != nil && got.Hash() != tt.want.Hash() {
|
||||
t.Fatalf("HeaderByNumber(%v) got = %v, want %v", tt.block, got, tt.want)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -202,11 +202,10 @@ func (i *iterator) Next() bool {
|
||||
i.first = false
|
||||
return i.iter.Valid()
|
||||
}
|
||||
// Check if iterator is still valid before advancing
|
||||
// On subsequent calls, only advance if currently valid
|
||||
if !i.iter.Valid() {
|
||||
return false
|
||||
}
|
||||
// On subsequent calls, advance and check
|
||||
i.iter.Next()
|
||||
return i.iter.Valid()
|
||||
}
|
||||
@@ -216,14 +215,14 @@ func (i *iterator) Error() error {
|
||||
}
|
||||
|
||||
func (i *iterator) Key() []byte {
|
||||
if i.iter == nil {
|
||||
if i.iter == nil || !i.iter.Valid() {
|
||||
return nil
|
||||
}
|
||||
return i.iter.Item().KeyCopy(nil)
|
||||
}
|
||||
|
||||
func (i *iterator) Value() []byte {
|
||||
if i.iter == nil {
|
||||
if i.iter == nil || !i.iter.Valid() {
|
||||
return nil
|
||||
}
|
||||
val, _ := i.iter.Item().ValueCopy(nil)
|
||||
|
||||
@@ -5,9 +5,10 @@ go 1.25.5
|
||||
require (
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3
|
||||
github.com/Microsoft/go-winio v0.6.2
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.1
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.7
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.7
|
||||
github.com/VictoriaMetrics/fastcache v1.13.2
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.0
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.6
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6
|
||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0
|
||||
github.com/cespare/cp v0.1.0
|
||||
github.com/cloudflare/cloudflare-go v0.116.0
|
||||
@@ -44,15 +45,13 @@ require (
|
||||
github.com/jackpal/go-nat-pmp v1.0.2
|
||||
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7
|
||||
github.com/kylelemons/godebug v1.1.0
|
||||
github.com/luxfi/cache v1.2.1
|
||||
github.com/luxfi/consensus v1.22.67
|
||||
github.com/luxfi/crypto v1.17.42
|
||||
github.com/luxfi/database v1.17.42
|
||||
github.com/luxfi/consensus v1.22.56
|
||||
github.com/luxfi/crypto v1.17.39
|
||||
github.com/luxfi/database v1.17.40
|
||||
github.com/luxfi/hid v0.9.3
|
||||
github.com/luxfi/ids v1.2.9
|
||||
github.com/luxfi/log v1.4.1
|
||||
github.com/luxfi/math/big v0.1.0
|
||||
github.com/luxfi/version v1.0.1
|
||||
github.com/mattn/go-colorable v0.1.14
|
||||
github.com/mattn/go-isatty v0.0.20
|
||||
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416
|
||||
@@ -70,12 +69,12 @@ require (
|
||||
github.com/urfave/cli/v2 v2.27.7
|
||||
go.uber.org/automaxprocs v1.6.0
|
||||
go.uber.org/goleak v1.3.0
|
||||
golang.org/x/crypto v0.47.0
|
||||
golang.org/x/crypto v0.46.0
|
||||
golang.org/x/sync v0.19.0
|
||||
golang.org/x/sys v0.40.0
|
||||
golang.org/x/text v0.33.0
|
||||
golang.org/x/sys v0.39.0
|
||||
golang.org/x/text v0.32.0
|
||||
golang.org/x/time v0.14.0
|
||||
golang.org/x/tools v0.41.0
|
||||
golang.org/x/tools v0.40.0
|
||||
google.golang.org/protobuf v1.36.11
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
@@ -87,21 +86,16 @@ require (
|
||||
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
|
||||
github.com/cockroachdb/errors v1.12.0 // indirect
|
||||
github.com/gorilla/rpc v1.2.1 // indirect
|
||||
github.com/luxfi/accel v1.0.1 // indirect
|
||||
github.com/luxfi/atomic v1.0.0 // indirect
|
||||
github.com/luxfi/codec v1.1.3 // indirect
|
||||
github.com/luxfi/compress v0.0.5 // indirect
|
||||
github.com/luxfi/concurrent v0.0.3 // indirect
|
||||
github.com/luxfi/constants v1.4.3 // indirect
|
||||
github.com/luxfi/container v0.0.4 // indirect
|
||||
github.com/luxfi/mock v0.1.1 // indirect
|
||||
github.com/luxfi/runtime v1.0.1 // indirect
|
||||
github.com/luxfi/utils v1.1.4 // indirect
|
||||
github.com/luxfi/validators v1.0.0 // indirect
|
||||
github.com/luxfi/zapdb/v4 v4.9.1 // indirect
|
||||
github.com/luxfi/utils v1.1.3 // indirect
|
||||
github.com/wlynxg/anet v0.0.5 // indirect
|
||||
go.uber.org/mock v0.6.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect
|
||||
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
@@ -110,28 +104,28 @@ require (
|
||||
github.com/DataDog/zstd v1.5.7 // indirect
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251230134950-44c893854e3f // indirect
|
||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
|
||||
github.com/aws/smithy-go v1.24.0 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bits-and-blooms/bitset v1.24.4 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cloudflare/circl v1.6.3 // indirect
|
||||
github.com/cloudflare/circl v1.6.2 // indirect
|
||||
github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect
|
||||
github.com/cockroachdb/redact v1.1.6 // indirect
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
|
||||
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
|
||||
github.com/dgraph-io/ristretto/v2 v2.4.0 // indirect
|
||||
github.com/dgraph-io/ristretto/v2 v2.3.0 // indirect
|
||||
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/emicklei/dot v1.10.0 // indirect
|
||||
@@ -150,16 +144,17 @@ require (
|
||||
github.com/google/pprof v0.0.0-20251213031049-b05bdaca462f // indirect
|
||||
github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect
|
||||
github.com/kilic/bls12-381 v0.1.0 // indirect
|
||||
github.com/klauspost/compress v1.18.3 // indirect
|
||||
github.com/klauspost/compress v1.18.2 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||
github.com/kr/pretty v0.3.1 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/luxfi/cache v1.2.1 // indirect
|
||||
github.com/luxfi/math v1.2.3
|
||||
github.com/luxfi/metric v1.5.0 // indirect
|
||||
github.com/luxfi/p2p v1.18.9 // indirect
|
||||
github.com/luxfi/precompile v0.4.7
|
||||
github.com/luxfi/p2p v1.18.7 // indirect
|
||||
github.com/luxfi/precompile v0.4.1
|
||||
github.com/luxfi/sampler v1.0.0 // indirect
|
||||
github.com/luxfi/vm v1.0.36
|
||||
github.com/luxfi/vm v1.0.20 // indirect
|
||||
github.com/luxfi/warp v1.18.5 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.19 // indirect
|
||||
github.com/minio/sha256-simd v1.0.1 // indirect
|
||||
@@ -190,8 +185,8 @@ require (
|
||||
go.opentelemetry.io/otel/metric v1.39.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.39.0 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
golang.org/x/mod v0.32.0 // indirect
|
||||
golang.org/x/net v0.49.0 // indirect
|
||||
golang.org/x/mod v0.31.0 // indirect
|
||||
golang.org/x/net v0.48.0 // indirect
|
||||
gonum.org/v1/gonum v0.16.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
|
||||
@@ -19,36 +19,40 @@ github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251230134950-44c893854e3f h1:a5PUgHGinaD6XrLmIDLQmGHocjIjBsBAcR5gALjZvMU=
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251230134950-44c893854e3f/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
|
||||
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
|
||||
github.com/VictoriaMetrics/fastcache v1.13.2 h1:2XTB49aLSuCex7e9P5rqrfQcMkzGjh5Vq3GMFa8YpCA=
|
||||
github.com/VictoriaMetrics/fastcache v1.13.2/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU=
|
||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
|
||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
|
||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU=
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.7 h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM=
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4=
|
||||
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=
|
||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 h1:80pDB3Tpmb2RCSZORrK9/3iQxsd+w6vSzVqpT1FGiwE=
|
||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0/go.mod h1:6EZUGGNLPLh5Unt30uEoA+KQcByERfXIkax9qrc80nA=
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y=
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5/go.mod h1:k029+U8SY30/3/ras4G/Fnv/b88N4mAfliNn08Dem4M=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 h1:v6EiMvhEYBoHABfbGB4alOYmCIrcgyPPiBE1wZAEbqk=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9/go.mod h1:yifAsgBxgJWn3ggx70A3urX2AN49Y5sJTD1UQFlfqBw=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 h1:gd84Omyu9JLriJVCbGApcLzVR3XtmC4ZDPcAI6Ftvds=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13/go.mod h1:sTGThjphYE4Ohw8vJiRStAcu3rbjtXRsdNB0TvZ5wwo=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 h1:5fFjR/ToSOzB2OQ/XqWpZBmNvmP/pJ1jOWYlFDJTjRQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6/go.mod h1:qgFDZQSD/Kys7nJnVqYlWKnh0SSdMjAi0uSwON4wgYQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=
|
||||
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
|
||||
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
@@ -67,8 +71,8 @@ github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfa
|
||||
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
|
||||
github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4=
|
||||
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
|
||||
github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8=
|
||||
github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
|
||||
github.com/cloudflare/circl v1.6.2 h1:hL7VBpHHKzrV5WTfHCaBsgx/HGbBYlgrwvNXEVDYYsQ=
|
||||
github.com/cloudflare/circl v1.6.2/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4=
|
||||
github.com/cloudflare/cloudflare-go v0.116.0 h1:iRPMnTtnswRpELO65NTwMX4+RTdxZl+Xf/zi+HPE95s=
|
||||
github.com/cloudflare/cloudflare-go v0.116.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
|
||||
@@ -108,8 +112,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
|
||||
github.com/dgraph-io/badger/v4 v4.9.0 h1:tpqWb0NewSrCYqTvywbcXOhQdWcqephkVkbBmaaqHzc=
|
||||
github.com/dgraph-io/badger/v4 v4.9.0/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0=
|
||||
github.com/dgraph-io/ristretto/v2 v2.4.0 h1:I/w09yLjhdcVD2QV192UJcq8dPBaAJb9pOuMyNy0XlU=
|
||||
github.com/dgraph-io/ristretto/v2 v2.4.0/go.mod h1:0KsrXtXvnv0EqnzyowllbVJB8yBonswa2lTCK2gGo9E=
|
||||
github.com/dgraph-io/ristretto/v2 v2.3.0 h1:qTQ38m7oIyd4GAed/QkUZyPFNMnvVWyazGXRwvOt5zk=
|
||||
github.com/dgraph-io/ristretto/v2 v2.3.0/go.mod h1:gpoRV3VzrEY1a9dWAYV6T1U7YzfgttXdd/ZzL1s9OZM=
|
||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38=
|
||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
|
||||
@@ -232,8 +236,8 @@ github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4
|
||||
github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw=
|
||||
github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
|
||||
github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk=
|
||||
github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
|
||||
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
@@ -244,10 +248,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4=
|
||||
github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c=
|
||||
github.com/luxfi/accel v1.0.1 h1:JtkOS5tSjdrVRGDHiuXxR6AIBaiSN1NpQc4FobgSl5w=
|
||||
github.com/luxfi/accel v1.0.1/go.mod h1:j5NCg8eKiQwhbRuJqa5G1oozcKp8HxJWMnrNA/CocWk=
|
||||
github.com/luxfi/atomic v1.0.0 h1:xUV60MuzRvXngaQ1sM0yVC2v4TRoLlUGkkH7M9PS4yw=
|
||||
github.com/luxfi/atomic v1.0.0/go.mod h1:0G2mTlQ6TXWHICUHrUUPu1/qAiIyR4gSZ2tva9ci/bI=
|
||||
github.com/luxfi/cache v1.2.1 h1:kAzOS55/hmYeNKR+0HAKv4ma48Y6JjkI8UQeqdZ8bfI=
|
||||
github.com/luxfi/cache v1.2.1/go.mod h1:co7JTxZZHpKT31Yh01LFp5aZOxmoUg157FhBLQdQHVU=
|
||||
github.com/luxfi/codec v1.1.3 h1:hK/pijaD/b3xP5ZNkGdDq26jRgFPQtYBLmAwOgxzw4c=
|
||||
@@ -256,16 +256,16 @@ github.com/luxfi/compress v0.0.5 h1:4tEUHw5MK1bu5UOjfYCt4OKMiH7yykIgmGPRA/BfJTM=
|
||||
github.com/luxfi/compress v0.0.5/go.mod h1:Cc1yxD2pfzrvpO32W2GDwLKff+CylHEvzZh2Ko8RSIU=
|
||||
github.com/luxfi/concurrent v0.0.3 h1:eJyv1fhaC0jMLMw6+QS774cUmp7GK+ouMgvLCqnC7cc=
|
||||
github.com/luxfi/concurrent v0.0.3/go.mod h1:Aj/FR5NpM0cB2P4Nt3+tz9+dV6V+LUW4HuMgSjwq5hw=
|
||||
github.com/luxfi/consensus v1.22.67 h1:+FHbXEg4UBkjfEieKr0Fsm4ZSM1CcTWg2nhcyL53DqM=
|
||||
github.com/luxfi/consensus v1.22.67/go.mod h1:mUffRVhwE3zz8bHwAIXT0xSroqOceszepHl8Tp6GwrI=
|
||||
github.com/luxfi/consensus v1.22.56 h1:0rvotEBzN9OmMmKIfNqU/vVYyIoAMbxDR1Rr7ZRVgfo=
|
||||
github.com/luxfi/consensus v1.22.56/go.mod h1:58WFlS5x0/qLxDevt6+Z9Z1zEmQG7KYv6Yfq00PWNys=
|
||||
github.com/luxfi/constants v1.4.3 h1:bcqUO8twMOhHWCgN/RbjfWulVPbvUQcxDkssaRrCx4g=
|
||||
github.com/luxfi/constants v1.4.3/go.mod h1:ENkJ121cmDEkwQPDiKK4QhnTnW9u37PGpepbrdVcAmc=
|
||||
github.com/luxfi/container v0.0.4 h1:BXhF82WyfqVP5mjlNcr7tP0Fcnvl0Ap1rkiu+rq5XuM=
|
||||
github.com/luxfi/container v0.0.4/go.mod h1:Z3SpmMF5d4t77MM0nHYXURpn+EMVaeu1fhbd/3BGaek=
|
||||
github.com/luxfi/crypto v1.17.42 h1:RQDN9dSBN7wWXND/XO56pQfneMvtlEA8Ngb6OpVBgY4=
|
||||
github.com/luxfi/crypto v1.17.42/go.mod h1:yz/86mgfby+aaf9hsHg8KIhHENueDsZpI9nnV+G4nW8=
|
||||
github.com/luxfi/database v1.17.42 h1:e3ZgWI155n/Nwzb2s4xhBWIQ2Lh3g5xuFA75KMII4zk=
|
||||
github.com/luxfi/database v1.17.42/go.mod h1:0nArLBm0r42J103oHR2xkAe8+mftuz5jtFgNylU1hgg=
|
||||
github.com/luxfi/crypto v1.17.39 h1:dDmktYOD/sU6WjIpitIfuHp7mRbc3izOsyJrQ1c5eOQ=
|
||||
github.com/luxfi/crypto v1.17.39/go.mod h1:mChLWmW4CLR1wAN6CeJTveCzUv0DTzGQnYgq01x3W0U=
|
||||
github.com/luxfi/database v1.17.40 h1:RPtRLbKu5yBM5fCSjR7CWzNqR0N1fg8r9y73hUww5sM=
|
||||
github.com/luxfi/database v1.17.40/go.mod h1:du1q0PemBc0gZcdtHhsARs6mIsZM3a5R/C040DVYLCM=
|
||||
github.com/luxfi/hid v0.9.3 h1:pMrOQQ4014IcZPt/MNul7eokXH4ypF6NkQs29/A3h/Y=
|
||||
github.com/luxfi/hid v0.9.3/go.mod h1:XJ/7DZAHf5dggm3zWNbitKuFGB7J96b4iX+8NO3BsnY=
|
||||
github.com/luxfi/ids v1.2.9 h1:+yjdhXW99drnd2Zlp1u/p8k3G23W3/1btJQ4ogHawUI=
|
||||
@@ -280,26 +280,18 @@ github.com/luxfi/metric v1.5.0 h1:11PKOjH6ntnnPF5GpspXFAqoKG9raqxT+zW5mN2jztI=
|
||||
github.com/luxfi/metric v1.5.0/go.mod h1:PkD4D4JoGuyKtfUkqPNYkrg9xKrJeNVZFdW/5XvAe/A=
|
||||
github.com/luxfi/mock v0.1.1 h1:0HEtIjg1J6CWz+IUyP6rsGqNWTcmxjFnSQIhaDuARwY=
|
||||
github.com/luxfi/mock v0.1.1/go.mod h1:jo35akl3Vtd8LbzDts8VJ0jmSVycrd1/eBi6g6t5hKU=
|
||||
github.com/luxfi/p2p v1.18.9 h1:xDqS04quYCVmiC1jBinSRQ2LAmY7E6XR4Dr7HdXHSy0=
|
||||
github.com/luxfi/p2p v1.18.9/go.mod h1:X829+oxzPyY2e5S9CyyMFiOtk6nyuNnxZSaSxGxrpKw=
|
||||
github.com/luxfi/precompile v0.4.7 h1:L47mOmWqCCQ9zkogUDjhvXXgBIJH9gx7ISGdZU4mHcM=
|
||||
github.com/luxfi/precompile v0.4.7/go.mod h1:HrDssVg6EQjWhunwYEGUO5VngS8Veng6TRBQy0NuSMU=
|
||||
github.com/luxfi/runtime v1.0.1 h1:cii3OsRiVSIl9jzfWFM6++62T1r6ZSGP+/3F0Ezhpqw=
|
||||
github.com/luxfi/runtime v1.0.1/go.mod h1:2hBKjzbEeE4dzrhUKH8dqkRgLEyiXz6GmuVusy3vJMs=
|
||||
github.com/luxfi/p2p v1.18.7 h1:TIgSSoSdRa0g61CbvAFovWgb3OwWGfOTh4RWi8en/fw=
|
||||
github.com/luxfi/p2p v1.18.7/go.mod h1:X829+oxzPyY2e5S9CyyMFiOtk6nyuNnxZSaSxGxrpKw=
|
||||
github.com/luxfi/precompile v0.4.1 h1:QBMCYsCWptPOVO0/BH1MY3QuE5cPkQ9nh85wDZDkzDc=
|
||||
github.com/luxfi/precompile v0.4.1/go.mod h1:Wqb52S3F5jA4H1In3Ygau+cAaiLq5iiS9AFLnBCozSE=
|
||||
github.com/luxfi/sampler v1.0.0 h1:k8Sf6otW83w4pQp0jXLA+g3J/joB7w7SqXQsWmNTOV0=
|
||||
github.com/luxfi/sampler v1.0.0/go.mod h1:f96/ozlj9vFfZj+akLtrHn4VpulQahwB+MQQhpeIekk=
|
||||
github.com/luxfi/utils v1.1.4 h1:8OY0jXCkpp6OotN1Y++6DATJkvtEwzq2k0p56imJlAk=
|
||||
github.com/luxfi/utils v1.1.4/go.mod h1:c3yz1RjzrB+cs5GZm+q1T3/2cCKElO9vxm9yRRtgSEM=
|
||||
github.com/luxfi/validators v1.0.0 h1:zE1HJM1lfvC+v1Lalg+MUgkKBGFWnwTfOOmXraiNnpE=
|
||||
github.com/luxfi/validators v1.0.0/go.mod h1:QGppjtI/gqprbplWc10J+4OIK8UYWpv+53mfH2aKhy4=
|
||||
github.com/luxfi/version v1.0.1 h1:T/1KYWEMmsrNQk7pN7PFPAwh/7XbeX7cFAKLBqI37Sk=
|
||||
github.com/luxfi/version v1.0.1/go.mod h1:Y5fPkQ2DB0XRBCxgSPXp4ISzL1/jptKnmFknShRJCyg=
|
||||
github.com/luxfi/vm v1.0.36 h1:lXM2qIYveWRAi73k+ilqEdyhfJpznAc/pxhhtkR7aL0=
|
||||
github.com/luxfi/vm v1.0.36/go.mod h1:s/ycKEqieJeCua7q0DGPtdCu3AL9dFeX2M54ddWEIYc=
|
||||
github.com/luxfi/utils v1.1.3 h1:yDEuuJ6bm9H8DzOzzveXI1AZlu/AeSpHNRrY1akbyc0=
|
||||
github.com/luxfi/utils v1.1.3/go.mod h1:lskchZiYYRBFsSyYg3NWLPw211uRyxIs3/wAzrfSIAk=
|
||||
github.com/luxfi/vm v1.0.20 h1:zAaCyb0+Og/6YA5wgzHeBUe2jzhluIXS7deJ4a5e9Lc=
|
||||
github.com/luxfi/vm v1.0.20/go.mod h1:plLVvTD/ym+RQCYZS91gWYghTu/IUIViLASREJhWnJY=
|
||||
github.com/luxfi/warp v1.18.5 h1:yXFCT+lnvzJHs8nVvfUCQ9wNvhtgbDGaXJkJeiwgKf4=
|
||||
github.com/luxfi/warp v1.18.5/go.mod h1:SFyC529HDvbP/TWRAdYQSyJUliMa5JKFRtBrTLEElp4=
|
||||
github.com/luxfi/zapdb/v4 v4.9.1 h1:oTg2ibBSxGtHTD9YHkclg5R1NecXWTi8R9XzY36uwgA=
|
||||
github.com/luxfi/zapdb/v4 v4.9.1/go.mod h1:gYJjLcFCxmUATZ6Zg7iZHwAbgBMxGVP1g8UOWomK70Y=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
@@ -455,16 +447,16 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
|
||||
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
|
||||
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU=
|
||||
golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU=
|
||||
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
|
||||
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
|
||||
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0=
|
||||
golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
|
||||
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
|
||||
golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
|
||||
golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
@@ -481,8 +473,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
|
||||
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
|
||||
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
|
||||
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@@ -519,8 +511,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
|
||||
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
@@ -536,8 +528,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
|
||||
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
|
||||
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
||||
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
|
||||
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
@@ -547,8 +539,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
|
||||
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
|
||||
golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
|
||||
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
+10
-2
@@ -707,6 +707,9 @@ func (b *Block) resolveHeader(ctx context.Context) (*types.Header, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if b.header == nil {
|
||||
return nil, nil
|
||||
}
|
||||
if b.hash == (common.Hash{}) {
|
||||
b.hash = b.header.Hash()
|
||||
}
|
||||
@@ -1034,10 +1037,15 @@ func (b *Block) OmmerAt(ctx context.Context, args struct{ Index Long }) (*Block,
|
||||
}
|
||||
|
||||
func (b *Block) WithdrawalsRoot(ctx context.Context) (*common.Hash, error) {
|
||||
header, err := b.resolveHeader(ctx)
|
||||
if err != nil {
|
||||
// Use the full block to get the correctly-interpreted header.
|
||||
// This is necessary because 17-field headers may be incorrectly decoded
|
||||
// as Lux format (ExtDataHash) instead of Ethereum format (WithdrawalsHash)
|
||||
// when read in isolation. ReadBlock applies the necessary reinterpretation.
|
||||
block, err := b.resolve(ctx)
|
||||
if err != nil || block == nil {
|
||||
return nil, err
|
||||
}
|
||||
header := block.Header()
|
||||
// Pre-shanghai blocks
|
||||
if header.WithdrawalsHash == nil {
|
||||
return nil, nil
|
||||
|
||||
@@ -374,9 +374,10 @@ func TestWithdrawals(t *testing.T) {
|
||||
var (
|
||||
key, _ = crypto.GenerateKey()
|
||||
addr = common.PubkeyToAddress(key.PublicKey)
|
||||
|
||||
// Create a local copy of AllEthashProtocolChanges to avoid mutating the global
|
||||
config = *params.AllEthashProtocolChanges
|
||||
genesis = &core.Genesis{
|
||||
Config: params.AllEthashProtocolChanges,
|
||||
Config: &config,
|
||||
GasLimit: 11500000,
|
||||
Difficulty: common.Big1,
|
||||
Alloc: types.GenesisAlloc{
|
||||
@@ -504,7 +505,7 @@ func newGQLService(t *testing.T, stack *node.Node, shanghai bool, gspec *core.Ge
|
||||
t.Fatalf("could not create eth backend: %v", err)
|
||||
}
|
||||
// Create some blocks and import them
|
||||
chain, _ := core.GenerateChain(params.AllEthashProtocolChanges, ethBackend.BlockChain().Genesis(),
|
||||
chain, _ := core.GenerateChain(gspec.Config, ethBackend.BlockChain().Genesis(),
|
||||
engine, ethBackend.ChainDb(), genBlocks, genfunc)
|
||||
_, err = ethBackend.BlockChain().InsertChain(chain)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user