VM execution fixes
Refactoring caused executing issues
This commit is contained in:
		
							parent
							
								
									33a0dec8a1
								
							
						
					
					
						commit
						399256b384
					
				| @ -148,6 +148,9 @@ func AddTestNetFunds(block *Block) { | ||||
| } | ||||
| 
 | ||||
| func (bc *BlockChain) setLastBlock() { | ||||
| 	// Prep genesis
 | ||||
| 	AddTestNetFunds(bc.genesisBlock) | ||||
| 
 | ||||
| 	data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) | ||||
| 	if len(data) != 0 { | ||||
| 		block := NewBlockFromBytes(data) | ||||
| @ -155,12 +158,7 @@ func (bc *BlockChain) setLastBlock() { | ||||
| 		bc.LastBlockHash = block.Hash() | ||||
| 		bc.LastBlockNumber = block.Number.Uint64() | ||||
| 
 | ||||
| 		if bc.LastBlockNumber == 0 { | ||||
| 			bc.genesisBlock = block | ||||
| 		} | ||||
| 	} else { | ||||
| 		AddTestNetFunds(bc.genesisBlock) | ||||
| 
 | ||||
| 		bc.genesisBlock.state.Trie.Sync() | ||||
| 		// Prepare the genesis block
 | ||||
| 		bc.Add(bc.genesisBlock) | ||||
|  | ||||
| @ -5,6 +5,7 @@ import ( | ||||
| 	"container/list" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| @ -154,6 +155,10 @@ done: | ||||
| 		if i < len(block.Receipts()) { | ||||
| 			original := block.Receipts()[i] | ||||
| 			if !original.Cmp(receipt) { | ||||
| 				if ethutil.Config.Diff { | ||||
| 					os.Exit(1) | ||||
| 				} | ||||
| 
 | ||||
| 				return nil, nil, nil, fmt.Errorf("err diff #%d (r) %v ~ %x  <=>  (c) %v ~ %x (%x)\n", i+1, original.CumulativeGasUsed, original.PostState[0:4], receipt.CumulativeGasUsed, receipt.PostState[0:4], receipt.Tx.Hash()) | ||||
| 			} | ||||
| 		} | ||||
| @ -307,14 +312,16 @@ func (sm *StateManager) ValidateBlock(block *Block) error { | ||||
| 
 | ||||
| 	// Check each uncle's previous hash. In order for it to be valid
 | ||||
| 	// is if it has the same block hash as the current
 | ||||
| 	previousBlock := sm.bc.GetBlock(block.PrevHash) | ||||
| 	for _, uncle := range block.Uncles { | ||||
| 		if bytes.Compare(uncle.PrevHash, previousBlock.PrevHash) != 0 { | ||||
| 			return ValidationError("Mismatch uncle's previous hash. Expected %x, got %x", previousBlock.PrevHash, uncle.PrevHash) | ||||
| 	parent := sm.bc.GetBlock(block.PrevHash) | ||||
| 	/* | ||||
| 		for _, uncle := range block.Uncles { | ||||
| 			if bytes.Compare(uncle.PrevHash,parent.PrevHash) != 0 { | ||||
| 				return ValidationError("Mismatch uncle's previous hash. Expected %x, got %x",parent.PrevHash, uncle.PrevHash) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	*/ | ||||
| 
 | ||||
| 	diff := block.Time - previousBlock.Time | ||||
| 	diff := block.Time - parent.Time | ||||
| 	if diff < 0 { | ||||
| 		return ValidationError("Block timestamp less then prev block %v (%v - %v)", diff, block.Time, sm.bc.CurrentBlock.Time) | ||||
| 	} | ||||
|  | ||||
| @ -23,7 +23,8 @@ import ( | ||||
| 
 | ||||
| const ( | ||||
| 	seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" | ||||
| 	seedNodeAddress        = "54.76.56.74:30303" | ||||
| 	//seedNodeAddress        = "54.76.56.74:30303"
 | ||||
| 	seedNodeAddress = "localhost:30303" | ||||
| ) | ||||
| 
 | ||||
| var ethlogger = ethlog.NewLogger("SERV") | ||||
|  | ||||
| @ -65,13 +65,13 @@ func (st *Stack) Peekn() (*big.Int, *big.Int) { | ||||
| } | ||||
| 
 | ||||
| func (st *Stack) Swapn(n int) (*big.Int, *big.Int) { | ||||
| 	st.data[n], st.data[0] = st.data[0], st.data[n] | ||||
| 	st.data[len(st.data)-n], st.data[len(st.data)-1] = st.data[len(st.data)-1], st.data[len(st.data)-n] | ||||
| 
 | ||||
| 	return st.data[n], st.data[0] | ||||
| 	return st.data[len(st.data)-n], st.data[len(st.data)-1] | ||||
| } | ||||
| 
 | ||||
| func (st *Stack) Dupn(n int) *big.Int { | ||||
| 	st.Push(st.data[n]) | ||||
| 	st.Push(st.data[len(st.data)-n]) | ||||
| 
 | ||||
| 	return st.Peek() | ||||
| } | ||||
|  | ||||
							
								
								
									
										49
									
								
								ethvm/vm.go
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								ethvm/vm.go
									
									
									
									
									
								
							| @ -63,7 +63,7 @@ func New(env Environment) *Vm { | ||||
| 		lt = LogTyDiff | ||||
| 	} | ||||
| 
 | ||||
| 	return &Vm{env: env, logTy: lt, Recoverable: true, queue: list.New()} | ||||
| 	return &Vm{env: env, logTy: lt, Recoverable: false, queue: list.New()} | ||||
| } | ||||
| 
 | ||||
| func calcMemSize(off, l *big.Int) *big.Int { | ||||
| @ -132,15 +132,13 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { | ||||
| 		// XXX Leave this Println intact. Don't change this to the log system.
 | ||||
| 		// Used for creating diffs between implementations
 | ||||
| 		if self.logTy == LogTyDiff { | ||||
| 			/* | ||||
| 				switch op { | ||||
| 				case STOP, RETURN, SUICIDE: | ||||
| 					closure.object.EachStorage(func(key string, value *ethutil.Value) { | ||||
| 						value.Decode() | ||||
| 						fmt.Printf("%x %x\n", new(big.Int).SetBytes([]byte(key)).Bytes(), value.Bytes()) | ||||
| 					}) | ||||
| 				} | ||||
| 			*/ | ||||
| 			switch op { | ||||
| 			case STOP, RETURN, SUICIDE: | ||||
| 				closure.object.EachStorage(func(key string, value *ethutil.Value) { | ||||
| 					value.Decode() | ||||
| 					fmt.Printf("%x %x\n", new(big.Int).SetBytes([]byte(key)).Bytes(), value.Bytes()) | ||||
| 				}) | ||||
| 			} | ||||
| 
 | ||||
| 			b := pc.Bytes() | ||||
| 			if len(b) == 0 { | ||||
| @ -230,13 +228,15 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { | ||||
| 		} | ||||
| 
 | ||||
| 		if newMemSize.Cmp(ethutil.Big0) > 0 { | ||||
| 			//newMemSize = (newMemSize + 31) / 32 * 32
 | ||||
| 			newMemSize = newMemSize.Add(newMemSize, u256(31)).Div(newMemSize, u256(32)).Mul(newMemSize, u256(32)) | ||||
| 			//if newMemSize > uint64(mem.Len()) {
 | ||||
| 			newMemSize.Add(newMemSize, u256(31)) | ||||
| 			newMemSize.Div(newMemSize, u256(32)) | ||||
| 			newMemSize.Mul(newMemSize, u256(32)) | ||||
| 
 | ||||
| 			if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 { | ||||
| 				newMemSize = newMemSize.Sub(newMemSize, u256(int64(mem.Len()))) | ||||
| 				memGasUsage := newMemSize.Mul(GasMemory, newMemSize).Div(newMemSize, u256(32)) | ||||
| 				//m := GasMemory.Uint64() * (newMemSize - uint64(mem.Len())) / 32
 | ||||
| 				memGasUsage := new(big.Int).Sub(newMemSize, u256(int64(mem.Len()))) | ||||
| 				memGasUsage.Mul(GasMemory, memGasUsage) | ||||
| 				memGasUsage.Div(memGasUsage, u256(32)) | ||||
| 
 | ||||
| 				addStepGasUsage(memGasUsage) | ||||
| 			} | ||||
| 		} | ||||
| @ -669,12 +669,12 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { | ||||
| 			require(1) | ||||
| 			stack.Pop() | ||||
| 		case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16: | ||||
| 			n := int(op - DUP1) | ||||
| 			n := int(op - DUP1 + 1) | ||||
| 			stack.Dupn(n) | ||||
| 
 | ||||
| 			self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes()) | ||||
| 		case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16: | ||||
| 			n := int(op - SWAP1) | ||||
| 			n := int(op - SWAP1 + 2) | ||||
| 			x, y := stack.Swapn(n) | ||||
| 
 | ||||
| 			self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes()) | ||||
| @ -694,12 +694,12 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) { | ||||
| 			self.Printf(" => 0x%x", val) | ||||
| 		case MSTORE8: | ||||
| 			require(2) | ||||
| 			val, mStart := stack.Popn() | ||||
| 			//base.And(val, new(big.Int).SetInt64(0xff))
 | ||||
| 			//mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(base, 256))
 | ||||
| 			mem.store[mStart.Int64()] = byte(val.Int64() & 0xff) | ||||
| 			off := stack.Pop() | ||||
| 			val := stack.Pop() | ||||
| 
 | ||||
| 			self.Printf(" => 0x%x", val) | ||||
| 			mem.store[off.Int64()] = byte(val.Int64() & 0xff) | ||||
| 
 | ||||
| 			self.Printf(" => [%v] 0x%x", off, val) | ||||
| 		case SLOAD: | ||||
| 			require(1) | ||||
| 			loc := stack.Pop() | ||||
| @ -955,6 +955,7 @@ func (self *Message) Addr() []byte { | ||||
| } | ||||
| 
 | ||||
| func (self *Message) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err error) { | ||||
| 	fmt.Printf("%x %x\n", codeAddr[0:4], self.address[0:4]) | ||||
| 	queue := self.vm.queue | ||||
| 	self.vm.queue = list.New() | ||||
| 
 | ||||
| @ -990,7 +991,7 @@ func (self *Message) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err e | ||||
| 		code := self.vm.env.State().GetCode(codeAddr) | ||||
| 
 | ||||
| 		// Create a new callable closure
 | ||||
| 		c := NewClosure(msg, caller, object, code, self.gas, self.price) | ||||
| 		c := NewClosure(msg, caller, stateObject, code, self.gas, self.price) | ||||
| 		// Executer the closure and get the return value (if any)
 | ||||
| 		ret, _, err = c.Call(self.vm, self.input) | ||||
| 
 | ||||
|  | ||||
| @ -282,8 +282,10 @@ func ReadMessages(conn net.Conn) (msgs []*Msg, err error) { | ||||
| 	var buff []byte | ||||
| 	var totalBytes int | ||||
| 	for { | ||||
| 		// This is a bit of a cheat actually to make buffering extremely fast.
 | ||||
| 		defer recover() | ||||
| 		// Give buffering some time
 | ||||
| 		conn.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) | ||||
| 		conn.SetReadDeadline(time.Now().Add(5 * time.Millisecond)) | ||||
| 		// Create a new temporarily buffer
 | ||||
| 		b := make([]byte, 1440) | ||||
| 		// Wait for a message from this peer
 | ||||
|  | ||||
							
								
								
									
										19
									
								
								peer.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								peer.go
									
									
									
									
									
								
							| @ -497,18 +497,16 @@ func (p *Peer) HandleInbound() { | ||||
| 					p.lastBlockReceived = time.Now() | ||||
| 				} | ||||
| 
 | ||||
| 				var err error | ||||
| 				blockPool.CheckLinkAndProcess(func(block *ethchain.Block) { | ||||
| 					err := p.ethereum.StateManager().Process(block, false) | ||||
| 					if err != nil { | ||||
| 						peerlogger.Infoln(err) | ||||
| 					} | ||||
| 					err = p.ethereum.StateManager().Process(block, false) | ||||
| 				}) | ||||
| 
 | ||||
| 				/* | ||||
| 					if !linked { | ||||
| 						p.FetchBlocks() | ||||
| 					} | ||||
| 				*/ | ||||
| 				if err != nil { | ||||
| 					peerlogger.Infoln(err) | ||||
| 				} else { | ||||
| 					p.FetchBlocks() | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @ -529,11 +527,10 @@ func (self *Peer) FetchHashes() { | ||||
| 	blockPool := self.ethereum.blockPool | ||||
| 
 | ||||
| 	if self.td.Cmp(blockPool.td) >= 0 { | ||||
| 		peerlogger.Debugf("Requesting hashes from %x\n", self.lastReceivedHash) | ||||
| 		blockPool.td = self.td | ||||
| 
 | ||||
| 		if !blockPool.HasLatestHash() { | ||||
| 			self.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{self.lastReceivedHash, uint32(200)})) | ||||
| 			self.QueueMessage(ethwire.NewMessage(ethwire.MsgGetBlockHashesTy, []interface{}{self.lastReceivedHash, uint32(256)})) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user