2014-08-11 17:23:17 +03:00
|
|
|
package ethstate
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/big"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Object manifest
|
|
|
|
//
|
|
|
|
// The object manifest is used to keep changes to the state so we can keep track of the changes
|
|
|
|
// that occurred during a state transitioning phase.
|
|
|
|
type Manifest struct {
|
|
|
|
// XXX These will be handy in the future. Not important for now.
|
|
|
|
objectAddresses map[string]bool
|
|
|
|
storageAddresses map[string]map[string]bool
|
|
|
|
|
|
|
|
ObjectChanges map[string]*StateObject
|
|
|
|
StorageChanges map[string]map[string]*big.Int
|
|
|
|
|
2014-08-15 01:25:16 +03:00
|
|
|
Messages Messages
|
2014-08-11 17:23:17 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewManifest() *Manifest {
|
|
|
|
m := &Manifest{objectAddresses: make(map[string]bool), storageAddresses: make(map[string]map[string]bool)}
|
|
|
|
m.Reset()
|
|
|
|
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Manifest) Reset() {
|
|
|
|
m.ObjectChanges = make(map[string]*StateObject)
|
|
|
|
m.StorageChanges = make(map[string]map[string]*big.Int)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Manifest) AddObjectChange(stateObject *StateObject) {
|
|
|
|
m.ObjectChanges[string(stateObject.Address())] = stateObject
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Manifest) AddStorageChange(stateObject *StateObject, storageAddr []byte, storage *big.Int) {
|
|
|
|
if m.StorageChanges[string(stateObject.Address())] == nil {
|
|
|
|
m.StorageChanges[string(stateObject.Address())] = make(map[string]*big.Int)
|
|
|
|
}
|
|
|
|
|
|
|
|
m.StorageChanges[string(stateObject.Address())][string(storageAddr)] = storage
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *Manifest) AddMessage(msg *Message) *Message {
|
|
|
|
self.Messages = append(self.Messages, msg)
|
|
|
|
|
|
|
|
return msg
|
|
|
|
}
|
|
|
|
|
2014-08-15 01:25:16 +03:00
|
|
|
type Messages []*Message
|
2014-08-11 17:23:17 +03:00
|
|
|
type Message struct {
|
|
|
|
To, From []byte
|
|
|
|
Input []byte
|
|
|
|
Output []byte
|
|
|
|
Path int
|
|
|
|
Origin []byte
|
|
|
|
Timestamp int64
|
|
|
|
Coinbase []byte
|
|
|
|
Block []byte
|
|
|
|
Number *big.Int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *Message) String() string {
|
|
|
|
return fmt.Sprintf("Message{to: %x from: %x input: %x output: %x origin: %x coinbase: %x block: %x number: %v timestamp: %d path: %d", self.To, self.From, self.Input, self.Output, self.Origin, self.Coinbase, self.Block, self.Number, self.Timestamp, self.Path)
|
|
|
|
}
|