mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
Fix storage: bswap and trim for values
This commit is contained in:
parent
bc59300ecb
commit
b21fc5ff9f
1 changed files with 24 additions and 4 deletions
28
vm/vm_jit.go
28
vm/vm_jit.go
|
|
@ -68,12 +68,30 @@ func llvm2hash(m *i256) []byte { //TODO: It should copy data
|
||||||
return *(*[]byte)(unsafe.Pointer(&hdr))
|
return *(*[]byte)(unsafe.Pointer(&hdr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bswap(m *i256) *i256 {
|
||||||
|
for i, l := 0, len(m); i < l/2; i++ {
|
||||||
|
m[i], m[l-i-1] = m[l-i-1], m[i]
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func trim(m []byte) []byte {
|
||||||
|
skip := 0
|
||||||
|
for i := 0; i < len(m); i++ {
|
||||||
|
if m[i] == 0 {
|
||||||
|
skip++
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m[skip:]
|
||||||
|
}
|
||||||
|
|
||||||
func big2llvm(n *big.Int) i256 {
|
func big2llvm(n *big.Int) i256 {
|
||||||
m := hash2llvm(n.Bytes())
|
m := hash2llvm(n.Bytes())
|
||||||
for i, l := 0, len(m); i < l/2; i++ {
|
for i, l := 0, len(m); i < l/2; i++ {
|
||||||
m[i], m[l-i-1] = m[l-i-1], m[i]
|
m[i], m[l-i-1] = m[l-i-1], m[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,18 +184,20 @@ func env_sha3(dataPtr *byte, length uint64, hashPtr unsafe.Pointer) {
|
||||||
//export env_sstore
|
//export env_sstore
|
||||||
func env_sstore(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, valuePtr unsafe.Pointer) {
|
func env_sstore(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, valuePtr unsafe.Pointer) {
|
||||||
vm := (*JitVm)(vmPtr)
|
vm := (*JitVm)(vmPtr)
|
||||||
index := llvm2hash((*i256)(indexPtr))
|
index := llvm2hash(bswap((*i256)(indexPtr)))
|
||||||
value := llvm2hash((*i256)(valuePtr))
|
value := llvm2hash(bswap((*i256)(valuePtr)))
|
||||||
|
value = trim(value)
|
||||||
vm.env.State().SetState(vm.me.Address(), index, value)
|
vm.env.State().SetState(vm.me.Address(), index, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_sload
|
//export env_sload
|
||||||
func env_sload(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, resultPtr unsafe.Pointer) {
|
func env_sload(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, resultPtr unsafe.Pointer) {
|
||||||
vm := (*JitVm)(vmPtr)
|
vm := (*JitVm)(vmPtr)
|
||||||
index := llvm2hash((*i256)(indexPtr))
|
index := llvm2hash(bswap((*i256)(indexPtr)))
|
||||||
value := vm.env.State().GetState(vm.me.Address(), index)
|
value := vm.env.State().GetState(vm.me.Address(), index)
|
||||||
result := (*i256)(resultPtr)
|
result := (*i256)(resultPtr)
|
||||||
*result = hash2llvm(value)
|
*result = hash2llvm(value)
|
||||||
|
bswap(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
//export env_balance
|
//export env_balance
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue