Merge pull request #1711 from Gustav-Simonsson/timestamp_big_int
Add tests for uncle timestamps and refactor timestamp type
This commit is contained in:
commit
abce09954b
@ -166,7 +166,7 @@ type VMEnv struct {
|
|||||||
|
|
||||||
depth int
|
depth int
|
||||||
Gas *big.Int
|
Gas *big.Int
|
||||||
time uint64
|
time *big.Int
|
||||||
logs []vm.StructLog
|
logs []vm.StructLog
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ func NewEnv(state *state.StateDB, transactor common.Address, value *big.Int) *VM
|
|||||||
state: state,
|
state: state,
|
||||||
transactor: &transactor,
|
transactor: &transactor,
|
||||||
value: value,
|
value: value,
|
||||||
time: uint64(time.Now().Unix()),
|
time: big.NewInt(time.Now().Unix()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ func (self *VMEnv) State() *state.StateDB { return self.state }
|
|||||||
func (self *VMEnv) Origin() common.Address { return *self.transactor }
|
func (self *VMEnv) Origin() common.Address { return *self.transactor }
|
||||||
func (self *VMEnv) BlockNumber() *big.Int { return common.Big0 }
|
func (self *VMEnv) BlockNumber() *big.Int { return common.Big0 }
|
||||||
func (self *VMEnv) Coinbase() common.Address { return *self.transactor }
|
func (self *VMEnv) Coinbase() common.Address { return *self.transactor }
|
||||||
func (self *VMEnv) Time() uint64 { return self.time }
|
func (self *VMEnv) Time() *big.Int { return self.time }
|
||||||
func (self *VMEnv) Difficulty() *big.Int { return common.Big1 }
|
func (self *VMEnv) Difficulty() *big.Int { return common.Big1 }
|
||||||
func (self *VMEnv) BlockHash() []byte { return make([]byte, 32) }
|
func (self *VMEnv) BlockHash() []byte { return make([]byte, 32) }
|
||||||
func (self *VMEnv) Value() *big.Int { return self.value }
|
func (self *VMEnv) Value() *big.Int { return self.value }
|
||||||
|
@ -203,7 +203,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st
|
|||||||
txs := block.Transactions()
|
txs := block.Transactions()
|
||||||
|
|
||||||
// Block validation
|
// Block validation
|
||||||
if err = ValidateHeader(sm.Pow, header, parent, false); err != nil {
|
if err = ValidateHeader(sm.Pow, header, parent, false, false); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty
|
|||||||
return UncleError("uncle[%d](%x)'s parent is not ancestor (%x)", i, hash[:4], uncle.ParentHash[0:4])
|
return UncleError("uncle[%d](%x)'s parent is not ancestor (%x)", i, hash[:4], uncle.ParentHash[0:4])
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash], true); err != nil {
|
if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash], true, true); err != nil {
|
||||||
return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err))
|
return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -358,19 +358,25 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro
|
|||||||
|
|
||||||
// See YP section 4.3.4. "Block Header Validity"
|
// See YP section 4.3.4. "Block Header Validity"
|
||||||
// Validates a block. Returns an error if the block is invalid.
|
// Validates a block. Returns an error if the block is invalid.
|
||||||
func ValidateHeader(pow pow.PoW, block *types.Header, parent *types.Block, checkPow bool) error {
|
func ValidateHeader(pow pow.PoW, block *types.Header, parent *types.Block, checkPow, uncle bool) error {
|
||||||
if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 {
|
if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 {
|
||||||
return fmt.Errorf("Block extra data too long (%d)", len(block.Extra))
|
return fmt.Errorf("Block extra data too long (%d)", len(block.Extra))
|
||||||
}
|
}
|
||||||
|
|
||||||
if block.Time > uint64(time.Now().Unix()) {
|
if uncle {
|
||||||
return BlockFutureErr
|
if block.Time.Cmp(common.MaxBig) == 1 {
|
||||||
|
return BlockTSTooBigErr
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if block.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 {
|
||||||
|
return BlockFutureErr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if block.Time <= parent.Time() {
|
if block.Time.Cmp(parent.Time()) != 1 {
|
||||||
return BlockEqualTSErr
|
return BlockEqualTSErr
|
||||||
}
|
}
|
||||||
|
|
||||||
expd := CalcDifficulty(block.Time, parent.Time(), parent.Number(), parent.Difficulty())
|
expd := CalcDifficulty(block.Time.Uint64(), parent.Time().Uint64(), parent.Number(), parent.Difficulty())
|
||||||
if expd.Cmp(block.Difficulty) != 0 {
|
if expd.Cmp(block.Difficulty) != 0 {
|
||||||
return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
|
return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd)
|
||||||
}
|
}
|
||||||
|
@ -48,13 +48,13 @@ func TestNumber(t *testing.T) {
|
|||||||
statedb := state.New(chain.Genesis().Root(), chain.chainDb)
|
statedb := state.New(chain.Genesis().Root(), chain.chainDb)
|
||||||
header := makeHeader(chain.Genesis(), statedb)
|
header := makeHeader(chain.Genesis(), statedb)
|
||||||
header.Number = big.NewInt(3)
|
header.Number = big.NewInt(3)
|
||||||
err := ValidateHeader(pow, header, chain.Genesis(), false)
|
err := ValidateHeader(pow, header, chain.Genesis(), false, false)
|
||||||
if err != BlockNumberErr {
|
if err != BlockNumberErr {
|
||||||
t.Errorf("expected block number error, got %q", err)
|
t.Errorf("expected block number error, got %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
header = makeHeader(chain.Genesis(), statedb)
|
header = makeHeader(chain.Genesis(), statedb)
|
||||||
err = ValidateHeader(pow, header, chain.Genesis(), false)
|
err = ValidateHeader(pow, header, chain.Genesis(), false, false)
|
||||||
if err == BlockNumberErr {
|
if err == BlockNumberErr {
|
||||||
t.Errorf("didn't expect block number error")
|
t.Errorf("didn't expect block number error")
|
||||||
}
|
}
|
||||||
|
@ -166,16 +166,21 @@ func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func makeHeader(parent *types.Block, state *state.StateDB) *types.Header {
|
func makeHeader(parent *types.Block, state *state.StateDB) *types.Header {
|
||||||
time := parent.Time() + 10 // block time is fixed at 10 seconds
|
var time *big.Int
|
||||||
|
if parent.Time() == nil {
|
||||||
|
time = big.NewInt(10)
|
||||||
|
} else {
|
||||||
|
time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds
|
||||||
|
}
|
||||||
return &types.Header{
|
return &types.Header{
|
||||||
Root: state.Root(),
|
Root: state.Root(),
|
||||||
ParentHash: parent.Hash(),
|
ParentHash: parent.Hash(),
|
||||||
Coinbase: parent.Coinbase(),
|
Coinbase: parent.Coinbase(),
|
||||||
Difficulty: CalcDifficulty(time, parent.Time(), parent.Number(), parent.Difficulty()),
|
Difficulty: CalcDifficulty(time.Uint64(), new(big.Int).Sub(time, big.NewInt(10)).Uint64(), parent.Number(), parent.Difficulty()),
|
||||||
GasLimit: CalcGasLimit(parent),
|
GasLimit: CalcGasLimit(parent),
|
||||||
GasUsed: new(big.Int),
|
GasUsed: new(big.Int),
|
||||||
Number: new(big.Int).Add(parent.Number(), common.Big1),
|
Number: new(big.Int).Add(parent.Number(), common.Big1),
|
||||||
Time: uint64(time),
|
Time: time,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,7 +596,8 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
|||||||
// Allow up to MaxFuture second in the future blocks. If this limit
|
// Allow up to MaxFuture second in the future blocks. If this limit
|
||||||
// is exceeded the chain is discarded and processed at a later time
|
// is exceeded the chain is discarded and processed at a later time
|
||||||
// if given.
|
// if given.
|
||||||
if max := uint64(time.Now().Unix()) + maxTimeFutureBlocks; block.Time() > max {
|
max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks)
|
||||||
|
if block.Time().Cmp(max) == 1 {
|
||||||
return i, fmt.Errorf("%v: BlockFutureErr, %v > %v", BlockFutureErr, block.Time(), max)
|
return i, fmt.Errorf("%v: BlockFutureErr, %v > %v", BlockFutureErr, block.Time(), max)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,9 +25,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
BlockNumberErr = errors.New("block number invalid")
|
BlockNumberErr = errors.New("block number invalid")
|
||||||
BlockFutureErr = errors.New("block time is in the future")
|
BlockFutureErr = errors.New("block time is in the future")
|
||||||
BlockEqualTSErr = errors.New("block time stamp equal to previous")
|
BlockTSTooBigErr = errors.New("block time too big")
|
||||||
|
BlockEqualTSErr = errors.New("block time stamp equal to previous")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parent error. In case a parent is unknown this error will be thrown
|
// Parent error. In case a parent is unknown this error will be thrown
|
||||||
|
@ -73,7 +73,7 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block,
|
|||||||
difficulty := common.String2Big(genesis.Difficulty)
|
difficulty := common.String2Big(genesis.Difficulty)
|
||||||
block := types.NewBlock(&types.Header{
|
block := types.NewBlock(&types.Header{
|
||||||
Nonce: types.EncodeNonce(common.String2Big(genesis.Nonce).Uint64()),
|
Nonce: types.EncodeNonce(common.String2Big(genesis.Nonce).Uint64()),
|
||||||
Time: common.String2Big(genesis.Timestamp).Uint64(),
|
Time: common.String2Big(genesis.Timestamp),
|
||||||
ParentHash: common.HexToHash(genesis.ParentHash),
|
ParentHash: common.HexToHash(genesis.ParentHash),
|
||||||
Extra: common.FromHex(genesis.ExtraData),
|
Extra: common.FromHex(genesis.ExtraData),
|
||||||
GasLimit: common.String2Big(genesis.GasLimit),
|
GasLimit: common.String2Big(genesis.GasLimit),
|
||||||
|
@ -60,7 +60,7 @@ type Header struct {
|
|||||||
Number *big.Int // The block number
|
Number *big.Int // The block number
|
||||||
GasLimit *big.Int // Gas limit
|
GasLimit *big.Int // Gas limit
|
||||||
GasUsed *big.Int // Gas used
|
GasUsed *big.Int // Gas used
|
||||||
Time uint64 // Creation time
|
Time *big.Int // Creation time
|
||||||
Extra []byte // Extra data
|
Extra []byte // Extra data
|
||||||
MixDigest common.Hash // for quick difficulty verification
|
MixDigest common.Hash // for quick difficulty verification
|
||||||
Nonce BlockNonce
|
Nonce BlockNonce
|
||||||
@ -94,7 +94,7 @@ func (h *Header) UnmarshalJSON(data []byte) error {
|
|||||||
Coinbase string
|
Coinbase string
|
||||||
Difficulty string
|
Difficulty string
|
||||||
GasLimit string
|
GasLimit string
|
||||||
Time uint64
|
Time *big.Int
|
||||||
Extra string
|
Extra string
|
||||||
}
|
}
|
||||||
dec := json.NewDecoder(bytes.NewReader(data))
|
dec := json.NewDecoder(bytes.NewReader(data))
|
||||||
@ -210,6 +210,9 @@ func NewBlockWithHeader(header *Header) *Block {
|
|||||||
|
|
||||||
func copyHeader(h *Header) *Header {
|
func copyHeader(h *Header) *Header {
|
||||||
cpy := *h
|
cpy := *h
|
||||||
|
if cpy.Time = new(big.Int); h.Time != nil {
|
||||||
|
cpy.Time.Set(h.Time)
|
||||||
|
}
|
||||||
if cpy.Difficulty = new(big.Int); h.Difficulty != nil {
|
if cpy.Difficulty = new(big.Int); h.Difficulty != nil {
|
||||||
cpy.Difficulty.Set(h.Difficulty)
|
cpy.Difficulty.Set(h.Difficulty)
|
||||||
}
|
}
|
||||||
@ -301,13 +304,13 @@ func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number)
|
|||||||
func (b *Block) GasLimit() *big.Int { return new(big.Int).Set(b.header.GasLimit) }
|
func (b *Block) GasLimit() *big.Int { return new(big.Int).Set(b.header.GasLimit) }
|
||||||
func (b *Block) GasUsed() *big.Int { return new(big.Int).Set(b.header.GasUsed) }
|
func (b *Block) GasUsed() *big.Int { return new(big.Int).Set(b.header.GasUsed) }
|
||||||
func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) }
|
func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) }
|
||||||
|
func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) }
|
||||||
|
|
||||||
func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() }
|
func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() }
|
||||||
func (b *Block) MixDigest() common.Hash { return b.header.MixDigest }
|
func (b *Block) MixDigest() common.Hash { return b.header.MixDigest }
|
||||||
func (b *Block) Nonce() uint64 { return binary.BigEndian.Uint64(b.header.Nonce[:]) }
|
func (b *Block) Nonce() uint64 { return binary.BigEndian.Uint64(b.header.Nonce[:]) }
|
||||||
func (b *Block) Bloom() Bloom { return b.header.Bloom }
|
func (b *Block) Bloom() Bloom { return b.header.Bloom }
|
||||||
func (b *Block) Coinbase() common.Address { return b.header.Coinbase }
|
func (b *Block) Coinbase() common.Address { return b.header.Coinbase }
|
||||||
func (b *Block) Time() uint64 { return b.header.Time }
|
|
||||||
func (b *Block) Root() common.Hash { return b.header.Root }
|
func (b *Block) Root() common.Hash { return b.header.Root }
|
||||||
func (b *Block) ParentHash() common.Hash { return b.header.ParentHash }
|
func (b *Block) ParentHash() common.Hash { return b.header.ParentHash }
|
||||||
func (b *Block) TxHash() common.Hash { return b.header.TxHash }
|
func (b *Block) TxHash() common.Hash { return b.header.TxHash }
|
||||||
|
@ -47,7 +47,7 @@ func TestBlockEncoding(t *testing.T) {
|
|||||||
check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017"))
|
check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017"))
|
||||||
check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e"))
|
check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e"))
|
||||||
check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4))
|
check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4))
|
||||||
check("Time", block.Time(), uint64(1426516743))
|
check("Time", block.Time(), big.NewInt(1426516743))
|
||||||
check("Size", block.Size(), common.StorageSize(len(blockEnc)))
|
check("Size", block.Size(), common.StorageSize(len(blockEnc)))
|
||||||
|
|
||||||
tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), big.NewInt(50000), big.NewInt(10), nil)
|
tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), big.NewInt(50000), big.NewInt(10), nil)
|
||||||
|
@ -33,7 +33,7 @@ type Environment interface {
|
|||||||
BlockNumber() *big.Int
|
BlockNumber() *big.Int
|
||||||
GetHash(n uint64) common.Hash
|
GetHash(n uint64) common.Hash
|
||||||
Coinbase() common.Address
|
Coinbase() common.Address
|
||||||
Time() uint64
|
Time() *big.Int
|
||||||
Difficulty() *big.Int
|
Difficulty() *big.Int
|
||||||
GasLimit() *big.Int
|
GasLimit() *big.Int
|
||||||
CanTransfer(from Account, balance *big.Int) bool
|
CanTransfer(from Account, balance *big.Int) bool
|
||||||
|
@ -341,7 +341,7 @@ func opCoinbase(instr instruction, env Environment, context *Context, memory *Me
|
|||||||
}
|
}
|
||||||
|
|
||||||
func opTimestamp(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) {
|
func opTimestamp(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) {
|
||||||
stack.push(U256(new(big.Int).SetUint64(env.Time())))
|
stack.push(U256(new(big.Int).Set(env.Time())))
|
||||||
}
|
}
|
||||||
|
|
||||||
func opNumber(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) {
|
func opNumber(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) {
|
||||||
|
@ -93,7 +93,7 @@ func (self *Env) StructLogs() []StructLog {
|
|||||||
|
|
||||||
//func (self *Env) PrevHash() []byte { return self.parent }
|
//func (self *Env) PrevHash() []byte { return self.parent }
|
||||||
func (self *Env) Coinbase() common.Address { return common.Address{} }
|
func (self *Env) Coinbase() common.Address { return common.Address{} }
|
||||||
func (self *Env) Time() uint64 { return uint64(time.Now().Unix()) }
|
func (self *Env) Time() *big.Int { return big.NewInt(time.Now().Unix()) }
|
||||||
func (self *Env) Difficulty() *big.Int { return big.NewInt(0) }
|
func (self *Env) Difficulty() *big.Int { return big.NewInt(0) }
|
||||||
func (self *Env) State() *state.StateDB { return nil }
|
func (self *Env) State() *state.StateDB { return nil }
|
||||||
func (self *Env) GasLimit() *big.Int { return self.gasLimit }
|
func (self *Env) GasLimit() *big.Int { return self.gasLimit }
|
||||||
|
@ -491,7 +491,7 @@ func (self *Vm) Run(context *Context, input []byte) (ret []byte, err error) {
|
|||||||
case TIMESTAMP:
|
case TIMESTAMP:
|
||||||
time := self.env.Time()
|
time := self.env.Time()
|
||||||
|
|
||||||
stack.push(new(big.Int).SetUint64(time))
|
stack.push(new(big.Int).Set(time))
|
||||||
|
|
||||||
case NUMBER:
|
case NUMBER:
|
||||||
number := self.env.BlockNumber()
|
number := self.env.BlockNumber()
|
||||||
|
@ -49,7 +49,7 @@ func NewEnv(state *state.StateDB, chain *ChainManager, msg Message, header *type
|
|||||||
func (self *VMEnv) Origin() common.Address { f, _ := self.msg.From(); return f }
|
func (self *VMEnv) Origin() common.Address { f, _ := self.msg.From(); return f }
|
||||||
func (self *VMEnv) BlockNumber() *big.Int { return self.header.Number }
|
func (self *VMEnv) BlockNumber() *big.Int { return self.header.Number }
|
||||||
func (self *VMEnv) Coinbase() common.Address { return self.header.Coinbase }
|
func (self *VMEnv) Coinbase() common.Address { return self.header.Coinbase }
|
||||||
func (self *VMEnv) Time() uint64 { return self.header.Time }
|
func (self *VMEnv) Time() *big.Int { return self.header.Time }
|
||||||
func (self *VMEnv) Difficulty() *big.Int { return self.header.Difficulty }
|
func (self *VMEnv) Difficulty() *big.Int { return self.header.Difficulty }
|
||||||
func (self *VMEnv) GasLimit() *big.Int { return self.header.GasLimit }
|
func (self *VMEnv) GasLimit() *big.Int { return self.header.GasLimit }
|
||||||
func (self *VMEnv) Value() *big.Int { return self.msg.Value() }
|
func (self *VMEnv) Value() *big.Int { return self.msg.Value() }
|
||||||
|
@ -117,7 +117,7 @@ func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow po
|
|||||||
manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.CurrentBlock, manager.chainman.InsertChain, manager.removePeer)
|
manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.CurrentBlock, manager.chainman.InsertChain, manager.removePeer)
|
||||||
|
|
||||||
validator := func(block *types.Block, parent *types.Block) error {
|
validator := func(block *types.Block, parent *types.Block) error {
|
||||||
return core.ValidateHeader(pow, block.Header(), parent, true)
|
return core.ValidateHeader(pow, block.Header(), parent, true, false)
|
||||||
}
|
}
|
||||||
heighter := func() uint64 {
|
heighter := func() uint64 {
|
||||||
return manager.chainman.CurrentBlock().NumberU64()
|
return manager.chainman.CurrentBlock().NumberU64()
|
||||||
|
@ -278,7 +278,7 @@ func (self *worker) wait() {
|
|||||||
glog.V(logger.Error).Infoln("Invalid block found during mining")
|
glog.V(logger.Error).Infoln("Invalid block found during mining")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := core.ValidateHeader(self.eth.BlockProcessor().Pow, block.Header(), parent, true); err != nil && err != core.BlockFutureErr {
|
if err := core.ValidateHeader(self.eth.BlockProcessor().Pow, block.Header(), parent, true, false); err != nil && err != core.BlockFutureErr {
|
||||||
glog.V(logger.Error).Infoln("Invalid header on mined block:", err)
|
glog.V(logger.Error).Infoln("Invalid header on mined block:", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -434,8 +434,8 @@ func (self *worker) commitNewWork() {
|
|||||||
tstart := time.Now()
|
tstart := time.Now()
|
||||||
parent := self.chain.CurrentBlock()
|
parent := self.chain.CurrentBlock()
|
||||||
tstamp := tstart.Unix()
|
tstamp := tstart.Unix()
|
||||||
if tstamp <= int64(parent.Time()) {
|
if parent.Time().Cmp(new(big.Int).SetInt64(tstamp)) != 1 {
|
||||||
tstamp = int64(parent.Time()) + 1
|
tstamp = parent.Time().Int64() + 1
|
||||||
}
|
}
|
||||||
// this will ensure we're not going off too far in the future
|
// this will ensure we're not going off too far in the future
|
||||||
if now := time.Now().Unix(); tstamp > now+4 {
|
if now := time.Now().Unix(); tstamp > now+4 {
|
||||||
@ -448,12 +448,12 @@ func (self *worker) commitNewWork() {
|
|||||||
header := &types.Header{
|
header := &types.Header{
|
||||||
ParentHash: parent.Hash(),
|
ParentHash: parent.Hash(),
|
||||||
Number: num.Add(num, common.Big1),
|
Number: num.Add(num, common.Big1),
|
||||||
Difficulty: core.CalcDifficulty(uint64(tstamp), parent.Time(), parent.Number(), parent.Difficulty()),
|
Difficulty: core.CalcDifficulty(uint64(tstamp), parent.Time().Uint64(), parent.Number(), parent.Difficulty()),
|
||||||
GasLimit: core.CalcGasLimit(parent),
|
GasLimit: core.CalcGasLimit(parent),
|
||||||
GasUsed: new(big.Int),
|
GasUsed: new(big.Int),
|
||||||
Coinbase: self.coinbase,
|
Coinbase: self.coinbase,
|
||||||
Extra: self.extra,
|
Extra: self.extra,
|
||||||
Time: uint64(tstamp),
|
Time: big.NewInt(tstamp),
|
||||||
}
|
}
|
||||||
|
|
||||||
previous := self.current
|
previous := self.current
|
||||||
|
@ -35,6 +35,13 @@ func TestBcUncleHeaderValidityTests(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBcUncleTests(t *testing.T) {
|
||||||
|
err := RunBlockTest(filepath.Join(blockTestDir, "bcUncleTest.json"), BlockSkipTests)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBcInvalidHeaderTests(t *testing.T) {
|
func TestBcInvalidHeaderTests(t *testing.T) {
|
||||||
err := RunBlockTest(filepath.Join(blockTestDir, "bcInvalidHeaderTest.json"), BlockSkipTests)
|
err := RunBlockTest(filepath.Join(blockTestDir, "bcInvalidHeaderTest.json"), BlockSkipTests)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -365,8 +365,8 @@ func (s *BlockTest) validateBlockHeader(h *btHeader, h2 *types.Header) error {
|
|||||||
return fmt.Errorf("GasUsed: expected: %v, decoded: %v", expectedGasUsed, h2.GasUsed)
|
return fmt.Errorf("GasUsed: expected: %v, decoded: %v", expectedGasUsed, h2.GasUsed)
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedTimestamp := mustConvertUint(h.Timestamp, 16)
|
expectedTimestamp := mustConvertBigInt(h.Timestamp, 16)
|
||||||
if expectedTimestamp != h2.Time {
|
if expectedTimestamp.Cmp(h2.Time) != 0 {
|
||||||
return fmt.Errorf("Timestamp: expected: %v, decoded: %v", expectedTimestamp, h2.Time)
|
return fmt.Errorf("Timestamp: expected: %v, decoded: %v", expectedTimestamp, h2.Time)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ func mustConvertHeader(in btHeader) *types.Header {
|
|||||||
GasUsed: mustConvertBigInt(in.GasUsed, 16),
|
GasUsed: mustConvertBigInt(in.GasUsed, 16),
|
||||||
GasLimit: mustConvertBigInt(in.GasLimit, 16),
|
GasLimit: mustConvertBigInt(in.GasLimit, 16),
|
||||||
Difficulty: mustConvertBigInt(in.Difficulty, 16),
|
Difficulty: mustConvertBigInt(in.Difficulty, 16),
|
||||||
Time: mustConvertUint(in.Timestamp, 16),
|
Time: mustConvertBigInt(in.Timestamp, 16),
|
||||||
Nonce: types.EncodeNonce(mustConvertUint(in.Nonce, 16)),
|
Nonce: types.EncodeNonce(mustConvertUint(in.Nonce, 16)),
|
||||||
}
|
}
|
||||||
return header
|
return header
|
||||||
|
@ -4543,5 +4543,318 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"uncleTimestampTooBig" : {
|
||||||
|
"blocks" : [
|
||||||
|
{
|
||||||
|
"blockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020000",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x5208",
|
||||||
|
"hash" : "6bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130e",
|
||||||
|
"mixHash" : "fefce638471ab6b66b1f1423ae574a99a6b2137229fe1846c508554d718d2bc1",
|
||||||
|
"nonce" : "f8cf2912afdd244d",
|
||||||
|
"number" : "0x01",
|
||||||
|
"parentHash" : "b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2",
|
||||||
|
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
|
||||||
|
"stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878",
|
||||||
|
"timestamp" : "0x55d9d69f",
|
||||||
|
"transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"rlp" : "0xf90261f901f9a0b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455d9d69f80a0fefce638471ab6b66b1f1423ae574a99a6b2137229fe1846c508554d718d2bc188f8cf2912afdd244df862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0",
|
||||||
|
"transactions" : [
|
||||||
|
{
|
||||||
|
"data" : "0x",
|
||||||
|
"gasLimit" : "0x04cb2f",
|
||||||
|
"gasPrice" : "0x01",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"r" : "0x77c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8",
|
||||||
|
"s" : "0x3f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288d",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"v" : "0x1b",
|
||||||
|
"value" : "0x0a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"uncleHeaders" : [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"blockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020040",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x5208",
|
||||||
|
"hash" : "4c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3f",
|
||||||
|
"mixHash" : "3449cf46635bab4ae7121dcd145e6ca12ac4337f79e88354c41bff1c48335b48",
|
||||||
|
"nonce" : "4376da5cd48ffb68",
|
||||||
|
"number" : "0x02",
|
||||||
|
"parentHash" : "6bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130e",
|
||||||
|
"receiptTrie" : "5ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6b",
|
||||||
|
"stateRoot" : "e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70e",
|
||||||
|
"timestamp" : "0x55d9d6a1",
|
||||||
|
"transactionsTrie" : "c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"rlp" : "0xf90260f901f9a06bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70ea0c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5a05ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88252088455d9d6a180a03449cf46635bab4ae7121dcd145e6ca12ac4337f79e88354c41bff1c48335b48884376da5cd48ffb68f861f85f01018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f239f1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cfc0",
|
||||||
|
"transactions" : [
|
||||||
|
{
|
||||||
|
"data" : "0x",
|
||||||
|
"gasLimit" : "0x04cb2f",
|
||||||
|
"gasPrice" : "0x01",
|
||||||
|
"nonce" : "0x01",
|
||||||
|
"r" : "0x33c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f23",
|
||||||
|
"s" : "0x1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cf",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"v" : "0x1b",
|
||||||
|
"value" : "0x0a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"uncleHeaders" : [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rlp" : "0xf90459f901f9a04c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3fa0f4fd3b99eb9b343e87bc472fdcd6b18e5cbcb231b1e70f8948e97b02c008ac26948888f1f195afa192cfee860698584c030f4c9db1a0e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07dea01722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1aa04ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920afb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd88252088455d9d6a680a0caf6f553d8c1394d291caaeabc61bc25f9126f4c313c829b2a51134cbd23d27188e6999e52421f5a38f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca015eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0eea05d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38f901f6f901f3a06bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcde5374fce5edbc8e2a8697c15331677e6ebf0ba0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000002832fefd8808080a077355633b05269548d6b3bd8e80d334fcb1a31c566b980dfc56eb57d5c16acc388846c622f81a727e7"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"genesisBlockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020000",
|
||||||
|
"extraData" : "0x42",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x00",
|
||||||
|
"hash" : "b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2",
|
||||||
|
"mixHash" : "b65f3c17c458ce015c087c3e4c0ffeeb010bf648a1faa2585c674d81ea7dcdfd",
|
||||||
|
"nonce" : "0b2ec3394d2421e3",
|
||||||
|
"number" : "0x00",
|
||||||
|
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1",
|
||||||
|
"timestamp" : "0x54c98c81",
|
||||||
|
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0b65f3c17c458ce015c087c3e4c0ffeeb010bf648a1faa2585c674d81ea7dcdfd880b2ec3394d2421e3c0c0",
|
||||||
|
"lastblockhash" : "4c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3f",
|
||||||
|
"postState" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "0x14",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8888f1f195afa192cfee860698584c030f4c9db1" : {
|
||||||
|
"balance" : "0x8ac7230489e8a410",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "0x09184e71fbdc",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x02",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "0x09184e72a000",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uncleTimestampMaxUint256" : {
|
||||||
|
"blocks" : [
|
||||||
|
{
|
||||||
|
"blockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020000",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x5208",
|
||||||
|
"hash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a",
|
||||||
|
"mixHash" : "4296af28ea723598c959f1cabc6f01fa0c75d126cfde89f13ccd9debcf3079c3",
|
||||||
|
"nonce" : "3213b3fd7789f5d5",
|
||||||
|
"number" : "0x01",
|
||||||
|
"parentHash" : "e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264",
|
||||||
|
"receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313",
|
||||||
|
"stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878",
|
||||||
|
"timestamp" : "0x55d9c571",
|
||||||
|
"transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"rlp" : "0xf90261f901f9a0e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455d9c57180a04296af28ea723598c959f1cabc6f01fa0c75d126cfde89f13ccd9debcf3079c3883213b3fd7789f5d5f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0",
|
||||||
|
"transactions" : [
|
||||||
|
{
|
||||||
|
"data" : "0x",
|
||||||
|
"gasLimit" : "0x04cb2f",
|
||||||
|
"gasPrice" : "0x01",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"r" : "0x77c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8",
|
||||||
|
"s" : "0x3f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288d",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"v" : "0x1b",
|
||||||
|
"value" : "0x0a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"uncleHeaders" : [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"blockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020040",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x5208",
|
||||||
|
"hash" : "04e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89",
|
||||||
|
"mixHash" : "782e9bf4a3427dee8cf2494f966830dd04a217eb5cf8769dba0ed6400212264f",
|
||||||
|
"nonce" : "e83b4878a0b9a46f",
|
||||||
|
"number" : "0x02",
|
||||||
|
"parentHash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a",
|
||||||
|
"receiptTrie" : "5ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6b",
|
||||||
|
"stateRoot" : "e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70e",
|
||||||
|
"timestamp" : "0x55d9c573",
|
||||||
|
"transactionsTrie" : "c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"rlp" : "0xf90260f901f9a019c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70ea0c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5a05ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88252088455d9c57380a0782e9bf4a3427dee8cf2494f966830dd04a217eb5cf8769dba0ed6400212264f88e83b4878a0b9a46ff861f85f01018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f239f1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cfc0",
|
||||||
|
"transactions" : [
|
||||||
|
{
|
||||||
|
"data" : "0x",
|
||||||
|
"gasLimit" : "0x04cb2f",
|
||||||
|
"gasPrice" : "0x01",
|
||||||
|
"nonce" : "0x01",
|
||||||
|
"r" : "0x33c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f23",
|
||||||
|
"s" : "0x1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cf",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"v" : "0x1b",
|
||||||
|
"value" : "0x0a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"uncleHeaders" : [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"blockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020080",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x5208",
|
||||||
|
"hash" : "eed1b4da708283370856fc76352d68f36d9766b7f366da372e2992ced9a1f663",
|
||||||
|
"mixHash" : "c250fe02a675a64e068023f48df2662ff2269d970f7689bde287228e200d5401",
|
||||||
|
"nonce" : "105781dacf8bcf41",
|
||||||
|
"number" : "0x03",
|
||||||
|
"parentHash" : "04e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89",
|
||||||
|
"receiptTrie" : "4ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920af",
|
||||||
|
"stateRoot" : "e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07de",
|
||||||
|
"timestamp" : "0x55d9c577",
|
||||||
|
"transactionsTrie" : "1722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1a",
|
||||||
|
"uncleHash" : "1e8797b712282d23d059df15e9082411499795fe2644bdfb35f310c10c78169b"
|
||||||
|
},
|
||||||
|
"rlp" : "0xf90479f901f9a004e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89a01e8797b712282d23d059df15e9082411499795fe2644bdfb35f310c10c78169b948888f1f195afa192cfee860698584c030f4c9db1a0e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07dea01722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1aa04ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920afb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd88252088455d9c57780a0c250fe02a675a64e068023f48df2662ff2269d970f7689bde287228e200d540188105781dacf8bcf41f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca015eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0eea05d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38f90216f90213a019c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcde5374fce5edbc8e2a8697c15331677e6ebf0ba0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000002832fefd880a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80a06868c784ca472bb16eb9b23029965a737713003d0da6c006e4923e400cd783fc88d99c24fcd2648302",
|
||||||
|
"transactions" : [
|
||||||
|
{
|
||||||
|
"data" : "0x",
|
||||||
|
"gasLimit" : "0x04cb2f",
|
||||||
|
"gasPrice" : "0x01",
|
||||||
|
"nonce" : "0x02",
|
||||||
|
"r" : "0x15eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0ee",
|
||||||
|
"s" : "0x5d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38",
|
||||||
|
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
|
||||||
|
"v" : "0x1c",
|
||||||
|
"value" : "0x0a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"uncleHeaders" : [
|
||||||
|
{
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "bcde5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||||
|
"difficulty" : "0x020000",
|
||||||
|
"extraData" : "0x",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x00",
|
||||||
|
"hash" : "5264110fedc6f468e9b3c1fead10ee4bdd4957bcb6d193503f8ede6a0d478b95",
|
||||||
|
"mixHash" : "6868c784ca472bb16eb9b23029965a737713003d0da6c006e4923e400cd783fc",
|
||||||
|
"nonce" : "d99c24fcd2648302",
|
||||||
|
"number" : "0x02",
|
||||||
|
"parentHash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a",
|
||||||
|
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878",
|
||||||
|
"timestamp" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
||||||
|
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"genesisBlockHeader" : {
|
||||||
|
"bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1",
|
||||||
|
"difficulty" : "0x020000",
|
||||||
|
"extraData" : "0x42",
|
||||||
|
"gasLimit" : "0x2fefd8",
|
||||||
|
"gasUsed" : "0x00",
|
||||||
|
"hash" : "e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264",
|
||||||
|
"mixHash" : "f35b4695bdfef02db19d255636bec7911667c7056df2b2f475053ea78dd1b0ff",
|
||||||
|
"nonce" : "5333c47f947590d8",
|
||||||
|
"number" : "0x00",
|
||||||
|
"parentHash" : "0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1",
|
||||||
|
"timestamp" : "0x54c98c81",
|
||||||
|
"transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||||
|
"uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"
|
||||||
|
},
|
||||||
|
"genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0f35b4695bdfef02db19d255636bec7911667c7056df2b2f475053ea78dd1b0ff885333c47f947590d8c0c0",
|
||||||
|
"lastblockhash" : "eed1b4da708283370856fc76352d68f36d9766b7f366da372e2992ced9a1f663",
|
||||||
|
"postState" : {
|
||||||
|
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
|
||||||
|
"balance" : "0x14",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8888f1f195afa192cfee860698584c030f4c9db1" : {
|
||||||
|
"balance" : "0x8ac7230489e8a410",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "0x09184e71fbdc",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x02",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pre" : {
|
||||||
|
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
|
||||||
|
"balance" : "0x09184e72a000",
|
||||||
|
"code" : "0x",
|
||||||
|
"nonce" : "0x00",
|
||||||
|
"storage" : {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -135,7 +135,7 @@ type Env struct {
|
|||||||
coinbase common.Address
|
coinbase common.Address
|
||||||
|
|
||||||
number *big.Int
|
number *big.Int
|
||||||
time uint64
|
time *big.Int
|
||||||
difficulty *big.Int
|
difficulty *big.Int
|
||||||
gasLimit *big.Int
|
gasLimit *big.Int
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ func NewEnvFromMap(state *state.StateDB, envValues map[string]string, exeValues
|
|||||||
//env.parent = common.Hex2Bytes(envValues["previousHash"])
|
//env.parent = common.Hex2Bytes(envValues["previousHash"])
|
||||||
env.coinbase = common.HexToAddress(envValues["currentCoinbase"])
|
env.coinbase = common.HexToAddress(envValues["currentCoinbase"])
|
||||||
env.number = common.Big(envValues["currentNumber"])
|
env.number = common.Big(envValues["currentNumber"])
|
||||||
env.time = common.Big(envValues["currentTimestamp"]).Uint64()
|
env.time = common.Big(envValues["currentTimestamp"])
|
||||||
env.difficulty = common.Big(envValues["currentDifficulty"])
|
env.difficulty = common.Big(envValues["currentDifficulty"])
|
||||||
env.gasLimit = common.Big(envValues["currentGasLimit"])
|
env.gasLimit = common.Big(envValues["currentGasLimit"])
|
||||||
env.Gas = new(big.Int)
|
env.Gas = new(big.Int)
|
||||||
@ -178,7 +178,7 @@ func (self *Env) BlockNumber() *big.Int { return self.number }
|
|||||||
|
|
||||||
//func (self *Env) PrevHash() []byte { return self.parent }
|
//func (self *Env) PrevHash() []byte { return self.parent }
|
||||||
func (self *Env) Coinbase() common.Address { return self.coinbase }
|
func (self *Env) Coinbase() common.Address { return self.coinbase }
|
||||||
func (self *Env) Time() uint64 { return self.time }
|
func (self *Env) Time() *big.Int { return self.time }
|
||||||
func (self *Env) Difficulty() *big.Int { return self.difficulty }
|
func (self *Env) Difficulty() *big.Int { return self.difficulty }
|
||||||
func (self *Env) State() *state.StateDB { return self.state }
|
func (self *Env) State() *state.StateDB { return self.state }
|
||||||
func (self *Env) GasLimit() *big.Int { return self.gasLimit }
|
func (self *Env) GasLimit() *big.Int { return self.gasLimit }
|
||||||
|
@ -19,6 +19,7 @@ package xeth
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/big"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
@ -76,7 +77,7 @@ type Block struct {
|
|||||||
Hash string `json:"hash"`
|
Hash string `json:"hash"`
|
||||||
Transactions *common.List `json:"transactions"`
|
Transactions *common.List `json:"transactions"`
|
||||||
Uncles *common.List `json:"uncles"`
|
Uncles *common.List `json:"uncles"`
|
||||||
Time uint64 `json:"time"`
|
Time *big.Int `json:"time"`
|
||||||
Coinbase string `json:"coinbase"`
|
Coinbase string `json:"coinbase"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
GasLimit string `json:"gasLimit"`
|
GasLimit string `json:"gasLimit"`
|
||||||
|
Loading…
Reference in New Issue
Block a user