From b21fc5ff9f57e4a31c0dfcf2342c81db693adb3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 15 Jan 2015 14:43:19 +0100 Subject: [PATCH] Fix storage: bswap and trim for values --- vm/vm_jit.go | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/vm/vm_jit.go b/vm/vm_jit.go index d84d3fb3cb..7d693a501b 100644 --- a/vm/vm_jit.go +++ b/vm/vm_jit.go @@ -68,12 +68,30 @@ func llvm2hash(m *i256) []byte { //TODO: It should copy data 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 { m := hash2llvm(n.Bytes()) for i, l := 0, len(m); i < l/2; i++ { m[i], m[l-i-1] = m[l-i-1], m[i] } - return m } @@ -166,18 +184,20 @@ func env_sha3(dataPtr *byte, length uint64, hashPtr unsafe.Pointer) { //export env_sstore func env_sstore(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, valuePtr unsafe.Pointer) { vm := (*JitVm)(vmPtr) - index := llvm2hash((*i256)(indexPtr)) - value := llvm2hash((*i256)(valuePtr)) + index := llvm2hash(bswap((*i256)(indexPtr))) + value := llvm2hash(bswap((*i256)(valuePtr))) + value = trim(value) vm.env.State().SetState(vm.me.Address(), index, value) } //export env_sload func env_sload(vmPtr unsafe.Pointer, indexPtr unsafe.Pointer, resultPtr unsafe.Pointer) { vm := (*JitVm)(vmPtr) - index := llvm2hash((*i256)(indexPtr)) + index := llvm2hash(bswap((*i256)(indexPtr))) value := vm.env.State().GetState(vm.me.Address(), index) result := (*i256)(resultPtr) *result = hash2llvm(value) + bswap(result) } //export env_balance