|
|
|
@ -1,11 +1,13 @@ |
|
|
|
|
package state |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"bytes" |
|
|
|
|
"fmt" |
|
|
|
|
"math/big" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/crypto" |
|
|
|
|
"github.com/ethereum/go-ethereum/ethutil" |
|
|
|
|
"github.com/ethereum/go-ethereum/rlp" |
|
|
|
|
"github.com/ethereum/go-ethereum/trie" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -71,8 +73,28 @@ func NewStateObject(addr []byte, db ethutil.Database) *StateObject { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewStateObjectFromBytes(address, data []byte, db ethutil.Database) *StateObject { |
|
|
|
|
// TODO clean me up
|
|
|
|
|
var extobject struct { |
|
|
|
|
Nonce uint64 |
|
|
|
|
Balance *big.Int |
|
|
|
|
Root []byte |
|
|
|
|
CodeHash []byte |
|
|
|
|
} |
|
|
|
|
err := rlp.Decode(bytes.NewReader(data), &extobject) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Println(err) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
object := &StateObject{address: address, db: db} |
|
|
|
|
object.RlpDecode(data) |
|
|
|
|
//object.RlpDecode(data)
|
|
|
|
|
object.Nonce = extobject.Nonce |
|
|
|
|
object.balance = extobject.Balance |
|
|
|
|
object.codeHash = extobject.CodeHash |
|
|
|
|
object.State = New(extobject.Root, db) |
|
|
|
|
object.storage = make(map[string]*ethutil.Value) |
|
|
|
|
object.gasPool = new(big.Int) |
|
|
|
|
object.Code, _ = db.Get(extobject.CodeHash) |
|
|
|
|
|
|
|
|
|
return object |
|
|
|
|
} |
|
|
|
@ -271,7 +293,6 @@ func (c *StateObject) CodeHash() ethutil.Bytes { |
|
|
|
|
|
|
|
|
|
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(decoder.Get(2).Bytes(), c.db) //New(trie.New(ethutil.Config.Db, decoder.Get(2).Interface()))
|
|
|
|
|