obscuren преди 10 години
родител
ревизия
cf45b939a0
променени са 4 файла, в които са добавени 16 реда и са изтрити 20 реда
  1. 7 2
      trie/trie.go
  2. 4 4
      vm/common.go
  3. 1 1
      vm/context.go
  4. 4 13
      vm/vm.go

+ 7 - 2
trie/trie.go

@@ -302,12 +302,17 @@ func (self *Trie) mknode(value *common.Value) Node {
 	case 2:
 		// A value node may consists of 2 bytes.
 		if value.Get(0).Len() != 0 {
-			return NewShortNode(self, CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
+			key := CompactDecode(string(value.Get(0).Bytes()))
+			if key[len(key)-1] == 16 {
+				return NewShortNode(self, key, &ValueNode{self, value.Get(1).Bytes()})
+			} else {
+				return NewShortNode(self, key, self.mknode(value.Get(1)))
+			}
 		}
 	case 17:
 		if len(value.Bytes()) != 17 {
 			fnode := NewFullNode(self)
-			for i := 0; i < l; i++ {
+			for i := 0; i < 16; i++ {
 				fnode.set(byte(i), self.mknode(value.Get(i)))
 			}
 			return fnode

+ 4 - 4
vm/common.go

@@ -119,9 +119,9 @@ func toValue(val *big.Int) interface{} {
 	return val
 }
 
-func getCode(code []byte, start, size uint64) []byte {
-	x := uint64(math.Min(float64(start), float64(len(code))))
-	y := uint64(math.Min(float64(x+size), float64(len(code))))
+func getData(data []byte, start, size uint64) []byte {
+	x := uint64(math.Min(float64(start), float64(len(data))))
+	y := uint64(math.Min(float64(x+size), float64(len(data))))
 
-	return common.RightPadBytes(code[x:y], int(size))
+	return common.RightPadBytes(data[x:y], int(size))
 }

+ 1 - 1
vm/context.go

@@ -65,7 +65,7 @@ func (c *Context) GetRangeValue(x, size uint64) []byte {
 }
 
 func (c *Context) GetCode(x, size uint64) []byte {
-	return getCode(c.Code, x, size)
+	return getData(c.Code, x, size)
 }
 
 func (c *Context) Return(ret []byte) []byte {

+ 4 - 13
vm/vm.go

@@ -443,24 +443,15 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
 			self.Printf(" => %d", l)
 		case CALLDATACOPY:
 			var (
-				size = uint64(len(callData))
 				mOff = stack.pop().Uint64()
 				cOff = stack.pop().Uint64()
 				l    = stack.pop().Uint64()
 			)
+			data := getData(callData, cOff, l)
 
-			if cOff > size {
-				cOff = 0
-				l = 0
-			} else if cOff+l > size {
-				l = 0
-			}
-
-			code := callData[cOff : cOff+l]
-
-			mem.Set(mOff, l, code)
+			mem.Set(mOff, l, data)
 
-			self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, callData[cOff:cOff+l])
+			self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, data)
 		case CODESIZE, EXTCODESIZE:
 			var code []byte
 			if op == EXTCODESIZE {
@@ -487,7 +478,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
 				cOff = stack.pop().Uint64()
 				l    = stack.pop().Uint64()
 			)
-			codeCopy := getCode(code, cOff, l)
+			codeCopy := getData(code, cOff, l)
 
 			mem.Set(mOff, l, codeCopy)