func CreateBlock(root interface{}, prevHash []byte, base []byte, Difficulty *big.Int, Nonce []byte, extra string) *Block { block := &Block{ PrevHash: prevHash, Coinbase: base, Difficulty: Difficulty, Nonce: Nonce, Time: time.Now().Unix(), Extra: extra, UncleSha: EmptyShaList, GasUsed: new(big.Int), MinGasPrice: new(big.Int), GasLimit: new(big.Int), } block.SetUncles([]*Block{}) block.state = ethstate.New(ethtrie.New(ethutil.Config.Db, root)) return block }
func NewContract(address []byte, balance *big.Int, root []byte) *StateObject { contract := NewStateObject(address) contract.Balance = balance contract.State = New(ethtrie.New(ethutil.Config.Db, string(root))) return contract }
func NewStateObject(addr []byte) *StateObject { // This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter. address := ethutil.Address(addr) object := &StateObject{address: address, Balance: new(big.Int), gasPool: new(big.Int)} object.State = New(ethtrie.New(ethutil.Config.Db, "")) object.storage = make(Storage) object.gasPool = new(big.Int) return object }
func (c *StateObject) RlpDecode(data []byte) { decoder := ethutil.NewValueFromBytes(data) c.Nonce = decoder.Get(0).Uint() c.Balance = decoder.Get(1).BigInt() c.State = New(ethtrie.New(ethutil.Config.Db, decoder.Get(2).Interface())) c.storage = make(map[string]*ethutil.Value) c.gasPool = new(big.Int) c.CodeHash = decoder.Get(3).Bytes() c.Code, _ = ethutil.Config.Db.Get(c.CodeHash) }
// Converts an transaction in to a state object func MakeContract(tx *Transaction, state *ethstate.State) *ethstate.StateObject { // Create contract if there's no recipient if tx.IsContract() { addr := tx.CreationAddress() contract := state.NewStateObject(addr) contract.InitCode = tx.Data contract.State = ethstate.New(ethtrie.New(ethutil.Config.Db, "")) return contract } return nil }
func CreateTxSha(receipts Receipts) (sha []byte) { trie := ethtrie.New(ethutil.Config.Db, "") for i, receipt := range receipts { trie.Update(string(ethutil.NewValue(i).Encode()), string(ethutil.NewValue(receipt.RlpData()).Encode())) } switch trie.Root.(type) { case string: sha = []byte(trie.Root.(string)) case []byte: sha = trie.Root.([]byte) default: panic(fmt.Sprintf("invalid root type %T", trie.Root)) } return sha }
func NewUncleBlockFromValue(header *ethutil.Value) *Block { block := &Block{} block.PrevHash = header.Get(0).Bytes() block.UncleSha = header.Get(1).Bytes() block.Coinbase = header.Get(2).Bytes() block.state = ethstate.New(ethtrie.New(ethutil.Config.Db, header.Get(3).Val)) block.TxSha = header.Get(4).Bytes() block.Difficulty = header.Get(5).BigInt() block.Number = header.Get(6).BigInt() block.MinGasPrice = header.Get(7).BigInt() block.GasLimit = header.Get(8).BigInt() block.GasUsed = header.Get(9).BigInt() block.Time = int64(header.Get(10).BigInt().Uint64()) block.Extra = header.Get(11).Str() block.Nonce = header.Get(12).Bytes() return block }
func (block *Block) RlpValueDecode(decoder *ethutil.Value) { header := decoder.Get(0) block.PrevHash = header.Get(0).Bytes() block.UncleSha = header.Get(1).Bytes() block.Coinbase = header.Get(2).Bytes() block.state = ethstate.New(ethtrie.New(ethutil.Config.Db, header.Get(3).Val)) block.TxSha = header.Get(4).Bytes() block.Difficulty = header.Get(5).BigInt() block.Number = header.Get(6).BigInt() //fmt.Printf("#%v : %x\n", block.Number, block.Coinbase) block.MinGasPrice = header.Get(7).BigInt() block.GasLimit = header.Get(8).BigInt() block.GasUsed = header.Get(9).BigInt() block.Time = int64(header.Get(10).BigInt().Uint64()) block.Extra = header.Get(11).Str() block.Nonce = header.Get(12).Bytes() // Tx list might be empty if this is an uncle. Uncles only have their // header set. if decoder.Get(1).IsNil() == false { // Yes explicitness receipts := decoder.Get(1) block.transactions = make([]*Transaction, receipts.Len()) block.receipts = make([]*Receipt, receipts.Len()) for i := 0; i < receipts.Len(); i++ { receipt := NewRecieptFromValue(receipts.Get(i)) block.transactions[i] = receipt.Tx block.receipts[i] = receipt } } if decoder.Get(2).IsNil() == false { // Yes explicitness uncles := decoder.Get(2) block.Uncles = make([]*Block, uncles.Len()) for i := 0; i < uncles.Len(); i++ { block.Uncles[i] = NewUncleBlockFromValue(uncles.Get(i)) } } }
func TestSnapshot(t *testing.T) { db, _ := ethdb.NewMemDatabase() ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") ethutil.Config.Db = db state := New(ethtrie.New(db, "")) stateObject := state.GetOrNewStateObject([]byte("aa")) stateObject.SetStorage(ethutil.Big("0"), ethutil.NewValue(42)) snapshot := state.Copy() stateObject = state.GetStateObject([]byte("aa")) stateObject.SetStorage(ethutil.Big("0"), ethutil.NewValue(43)) state.Set(snapshot) stateObject = state.GetStateObject([]byte("aa")) res := stateObject.GetStorage(ethutil.Big("0")) if !res.Cmp(ethutil.NewValue(42)) { t.Error("Expected storage 0 to be 42", res) } }