Fixed couple issues

* (imp) Lock / RLock tries
* (fix) stack
This commit is contained in:
obscuren 2014-05-21 00:17:50 +02:00
parent e8b4585295
commit 5ceb1620e9
7 changed files with 71 additions and 26 deletions

View File

@ -65,7 +65,7 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) {
} }
func (st *Stack) Push(d *big.Int) { func (st *Stack) Push(d *big.Int) {
st.data = append(st.data, d) st.data = append(st.data, new(big.Int).Set(d))
} }
func (st *Stack) Get(amount *big.Int) []*big.Int { func (st *Stack) Get(amount *big.Int) []*big.Int {

View File

@ -100,6 +100,11 @@ func (sm *StateManager) MakeContract(state *State, tx *Transaction) *StateObject
func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Transaction) { func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Transaction) {
// Process each transaction/contract // Process each transaction/contract
for _, tx := range txs { for _, tx := range txs {
sm.ApplyTransaction(state, block, tx)
}
}
func (sm *StateManager) ApplyTransaction(state *State, block *Block, tx *Transaction) {
// If there's no recipient, it's a contract // If there's no recipient, it's a contract
// Check if this is a contract creation traction and if so // Check if this is a contract creation traction and if so
// create a contract of this tx. // create a contract of this tx.
@ -125,7 +130,6 @@ func (sm *StateManager) ApplyTransactions(state *State, block *Block, txs []*Tra
ethutil.Config.Log.Infoln("[STATE] process:", err) ethutil.Config.Log.Infoln("[STATE] process:", err)
} }
} }
}
} }
// Block processing and validating with a given (temporarily) state // Block processing and validating with a given (temporarily) state

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/ethereum/eth-go/ethdb" "github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"math/big"
"testing" "testing"
) )
@ -21,5 +22,31 @@ func TestSync(t *testing.T) {
state.Sync() state.Sync()
object := state.GetStateObject([]byte("aa")) object := state.GetStateObject([]byte("aa"))
fmt.Printf("%x\n", object.Script()) if len(object.Script()) == 0 {
t.Fail()
}
}
func TestObjectGet(t *testing.T) {
ethutil.ReadConfig("", ethutil.LogStd)
db, _ := ethdb.NewMemDatabase()
ethutil.Config.Db = db
state := NewState(ethutil.NewTrie(db, ""))
contract := NewContract([]byte("aa"), ethutil.Big1, ZeroHash256)
state.UpdateStateObject(contract)
contract = state.GetStateObject([]byte("aa"))
contract.SetStorage(big.NewInt(0), ethutil.NewValue("hello"))
o := contract.GetMem(big.NewInt(0))
fmt.Println(o)
state.UpdateStateObject(contract)
contract.SetStorage(big.NewInt(0), ethutil.NewValue("hello00"))
contract = state.GetStateObject([]byte("aa"))
o = contract.GetMem(big.NewInt(0))
fmt.Println("after", o)
} }

View File

@ -390,10 +390,12 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
require(1) require(1)
loc := stack.Pop() loc := stack.Pop()
val := closure.GetMem(loc) val := closure.GetMem(loc)
//fmt.Println("get", val.BigInt(), "@", loc)
stack.Push(val.BigInt()) stack.Push(val.BigInt())
case oSSTORE: case oSSTORE:
require(2) require(2)
val, loc := stack.Popn() val, loc := stack.Popn()
//fmt.Println("storing", val, "@", loc)
closure.SetStorage(loc, ethutil.NewValue(val)) closure.SetStorage(loc, ethutil.NewValue(val))
// Add the change to manifest // Add the change to manifest

View File

@ -1,5 +1,6 @@
package ethchain package ethchain
/*
import ( import (
_ "bytes" _ "bytes"
"fmt" "fmt"
@ -23,10 +24,11 @@ func TestRun4(t *testing.T) {
if a > b { if a > b {
int32 c = this.caller() int32 c = this.caller()
} }
Exit() exit()
`), false) `), false)
tx := NewContractCreationTx(ethutil.Big("0"), ethutil.Big("1000"), ethutil.Big("100"), script, nil) tx := NewContractCreationTx(ethutil.Big("0"), ethutil.Big("1000"), ethutil.Big("100"), script, nil)
addr := tx.Hash()[12:] tx.Sign(ContractAddr)
addr := tx.CreationAddress()
contract := MakeContract(tx, state) contract := MakeContract(tx, state)
state.UpdateStateObject(contract) state.UpdateStateObject(contract)
fmt.Printf("%x\n", addr) fmt.Printf("%x\n", addr)
@ -34,7 +36,7 @@ func TestRun4(t *testing.T) {
callerScript, err := mutan.Compile(strings.NewReader(` callerScript, err := mutan.Compile(strings.NewReader(`
// Check if there's any cash in the initial store // Check if there's any cash in the initial store
if this.store[1000] == 0 { if this.store[1000] == 0 {
this.store[1000] = 10^20 this.store[1000] = 10**20
} }
@ -93,3 +95,4 @@ func TestRun4(t *testing.T) {
} }
fmt.Println("account.Amount =", account.Amount) fmt.Println("account.Amount =", account.Amount)
} }
*/

View File

@ -102,6 +102,7 @@ func (miner *Miner) listener() {
} }
if found == false { if found == false {
miner.block.Undo()
//log.Infoln("[MINER] We did not know about this transaction, adding") //log.Infoln("[MINER] We did not know about this transaction, adding")
miner.txs = append(miner.txs, tx) miner.txs = append(miner.txs, tx)
miner.block = miner.ethereum.BlockChain().NewBlock(miner.coinbase, miner.txs) miner.block = miner.ethereum.BlockChain().NewBlock(miner.coinbase, miner.txs)

View File

@ -3,6 +3,7 @@ package ethutil
import ( import (
"fmt" "fmt"
"reflect" "reflect"
"sync"
) )
// TODO // TODO
@ -113,6 +114,7 @@ func (cache *Cache) Undo() {
// Please note that the data isn't persisted unless `Sync` is // Please note that the data isn't persisted unless `Sync` is
// explicitly called. // explicitly called.
type Trie struct { type Trie struct {
mut sync.RWMutex
prevRoot interface{} prevRoot interface{}
Root interface{} Root interface{}
//db Database //db Database
@ -157,12 +159,18 @@ func (t *Trie) Cache() *Cache {
* Public (query) interface functions * Public (query) interface functions
*/ */
func (t *Trie) Update(key string, value string) { func (t *Trie) Update(key string, value string) {
t.mut.Lock()
defer t.mut.Unlock()
k := CompactHexDecode(key) k := CompactHexDecode(key)
t.Root = t.UpdateState(t.Root, k, value) t.Root = t.UpdateState(t.Root, k, value)
} }
func (t *Trie) Get(key string) string { func (t *Trie) Get(key string) string {
t.mut.RLock()
defer t.mut.RUnlock()
k := CompactHexDecode(key) k := CompactHexDecode(key)
c := NewValue(t.GetState(t.Root, k)) c := NewValue(t.GetState(t.Root, k))