From 0221757cd818198915ffefb0c3e33333f3bb6ecc Mon Sep 17 00:00:00 2001 From: Leonidas Date: Thu, 6 Feb 2025 11:43:10 +0200 Subject: [PATCH] Updates to host calls v0.6.0 --- .../polkavm/host_call/accumulate_functions.go | 28 +++---- internal/polkavm/host_call/common.go | 21 +++++ .../polkavm/host_call/general_functions.go | 82 ++++++++----------- .../host_call/general_functions_test.go | 24 +++--- .../polkavm/host_call/refine_functions.go | 52 +++++------- .../host_call/refine_functions_test.go | 21 ++--- 6 files changed, 114 insertions(+), 114 deletions(-) diff --git a/internal/polkavm/host_call/accumulate_functions.go b/internal/polkavm/host_call/accumulate_functions.go index a41d4a3..ba0a4e8 100644 --- a/internal/polkavm/host_call/accumulate_functions.go +++ b/internal/polkavm/host_call/accumulate_functions.go @@ -26,11 +26,11 @@ func Bless(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) ( for i := range uint32(servicesNr) { serviceId, err := readNumber[block.ServiceId](mem, uint32(addr)+(12*i), 4) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, err + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } serviceGas, err := readNumber[uint64](mem, uint32(addr)+(12*i)+4, 8) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, err + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } if ctxPair.RegularCtx.AccumulationState.PrivilegedServices.AmountOfGasPerServiceId == nil { @@ -60,7 +60,7 @@ func Assign(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) for i := 0; i < state.PendingAuthorizersQueueSize; i++ { bytes := make([]byte, 32) if err := mem.Read(uint32(addr)+uint32(32*i), bytes); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } ctxPair.RegularCtx.AccumulationState.PendingAuthorizersQueues[core][i] = crypto.Hash(bytes) } @@ -85,7 +85,7 @@ func Designate(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPai for i := 0; i < common.NumberOfValidators; i++ { bytes := make([]byte, 336) if err := mem.Read(uint32(addr)+uint32(336*i), bytes); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } ctxPair.RegularCtx.AccumulationState.ValidatorKeys[i] = &crypto.ValidatorKey{ @@ -127,7 +127,7 @@ func New(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) (Ga // c = μo⋅⋅⋅+32 if No⋅⋅⋅+32 ⊂ Vμ otherwise ∇ codeHashBytes := make([]byte, 32) if err := mem.Read(uint32(addr), codeHashBytes); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } codeHash := crypto.Hash(codeHashBytes) @@ -186,7 +186,7 @@ func Upgrade(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) // c = μo⋅⋅⋅+32 if No⋅⋅⋅+32 ⊂ Vμ otherwise ∇ codeHash := make([]byte, 32) if err := mem.Read(uint32(addr), codeHash); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // (ω′7, (X′s)c, (X′s)g , (X′s)m) = (OK, c, g, m) if c ≠ ∇ @@ -213,7 +213,7 @@ func Transfer(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair // m = μo⋅⋅⋅+M if No⋅⋅⋅+WT ⊂ Vμ otherwise ∇ m := make([]byte, service.TransferMemoSizeBytes) if err := mem.Read(uint32(o), m); err != nil { - return gas, withCode(regs, OK), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // let t ∈ T = (s, d, a, m, g) @@ -262,7 +262,7 @@ func Eject(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair, t h := make([]byte, 32) if err := mem.Read(uint32(o), h); err != nil { // otherwise ∇ - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } if block.ServiceId(d) == ctxPair.RegularCtx.ServiceId { @@ -327,8 +327,8 @@ func Query(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) ( // let h = μo..o+32 if Zo..o+32 ⊂ Vμ h := make([]byte, 32) if err := mem.Read(uint32(addr), h); err != nil { - // otherwise ∇ => OOB - return gas, withCode(regs, OOB), mem, ctxPair, nil + // otherwise ∇ => panic + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // let a = (xs)l[h, z] if (h, z) ∈ K((xs)l) @@ -374,7 +374,7 @@ func Solicit(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair, // let h = μo⋅⋅⋅+32 if Zo⋅⋅⋅+32 ⊂ Vμ otherwise ∇ preimageHashBytes := make([]byte, 32) if err := mem.Read(uint32(addr), preimageHashBytes); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // let a = xs @@ -415,7 +415,7 @@ func Forget(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair, // let h = μo⋅⋅⋅+32 if Zo⋅⋅⋅+32 ⊂ Vμ otherwise ∇ preimageHashBytes := make([]byte, 32) if err := mem.Read(uint32(addr), preimageHashBytes); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // let a = xs @@ -480,8 +480,8 @@ func Yield(gas Gas, regs Registers, mem Memory, ctxPair AccumulateContextPair) ( // let h = μo..o+32 if Zo..o+32 ⊂ Vμ otherwise ∇ hBytes := make([]byte, 32) if err := mem.Read(uint32(addr), hBytes); err != nil { - // (ω′7, x′_y) = (OOB, x_y) if h = ∇ - return gas, withCode(regs, OOB), mem, ctxPair, nil + // (ε', ω′7, x′_y) = (panic, ω7, x_y) if h = ∇ + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // (ω′7, x′_y) = (OK, h) otherwise diff --git a/internal/polkavm/host_call/common.go b/internal/polkavm/host_call/common.go index b81134f..2b48358 100644 --- a/internal/polkavm/host_call/common.go +++ b/internal/polkavm/host_call/common.go @@ -131,3 +131,24 @@ func withCode(regs Registers, s Code) Registers { regs[A0] = uint64(s) return regs } + +func writeFromOffset( + mem Memory, + addressToWrite uint64, + data []byte, + offset uint64, + length uint64, +) error { + vLen := uint64(len(data)) + + f := min(offset, vLen) + l := min(length, vLen-f) + + if l > 0 { + sliceToWrite := data[f : f+l] + if err := mem.Write(uint32(addressToWrite), sliceToWrite); err != nil { + return ErrPanicf("out-of-bounds write at address %d", addressToWrite) + } + } + return nil +} diff --git a/internal/polkavm/host_call/general_functions.go b/internal/polkavm/host_call/general_functions.go index 3a3aab8..e232363 100644 --- a/internal/polkavm/host_call/general_functions.go +++ b/internal/polkavm/host_call/general_functions.go @@ -54,38 +54,27 @@ func Lookup(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s servi } } - ho := regs[polkavm.A1] + // let [h, o] = ω8..+2 + h, o := regs[polkavm.A1], regs[polkavm.A2] - // Ensure the memory range is valid for hashing (µho..ho+32) - memorySlice := make([]byte, 32) - err := mem.Read(uint32(ho), memorySlice) - if err != nil { - return gas, withCode(regs, OOB), mem, err + key := make([]byte, 32) + if err := mem.Read(uint32(h), key); err != nil { + return gas, regs, mem, polkavm.ErrPanicf(err.Error()) } - // Compute the hash H(µho..ho+32) - hash := crypto.HashData(memorySlice) - // lookup value in storage (v) using the hash - v, exists := a.Storage[hash] + v, exists := a.PreimageLookup[crypto.Hash(key)] if !exists { + // v=∅ => (▸, NONE, μ) return gas, withCode(regs, NONE), mem, nil } - bo := regs[polkavm.A2] - bz := regs[polkavm.A3] - - // Write value to memory if within bounds - if len(v) > 0 && len(v) <= int(bz) { - if err = mem.Write(uint32(bo), v); err != nil { - return gas, withCode(regs, OOB), mem, err - } - } else { - return gas, withCode(regs, OOB), mem, err + if err := writeFromOffset(mem, o, v, regs[polkavm.A3], regs[polkavm.A4]); err != nil { + return gas, regs, mem, err } regs[polkavm.A0] = uint64(len(v)) - return gas, regs, mem, err + return gas, regs, mem, nil } // Read ΩR(ϱ, ω, μ, s, s, d) @@ -96,28 +85,33 @@ func Read(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s service gas -= ReadCost omega7 := regs[polkavm.A0] - ko := regs[polkavm.A1] - kz := regs[polkavm.A2] - bo := regs[polkavm.A3] - bz := regs[polkavm.A4] + // s* = ω7 + ss := block.ServiceId(omega7) + if uint64(omega7) == math.MaxUint64 { + ss = serviceId // s* = s + } a := s - if uint64(omega7) != math.MaxUint64 && omega7 != uint64(serviceId) { + if ss != serviceId { var exists bool - a, exists = serviceState[block.ServiceId(omega7)] + a, exists = serviceState[ss] if !exists { return gas, regs, mem, polkavm.ErrAccountNotFound } } + // let [ko, kz, o] = ω8..+3 + ko, kz, o := regs[polkavm.A1], regs[polkavm.A2], regs[polkavm.A3] + // read key data from memory at ko..ko+kz keyData := make([]byte, kz) err := mem.Read(uint32(ko), keyData) if err != nil { - return gas, withCode(regs, OOB), mem, nil + return gas, regs, mem, polkavm.ErrPanicf(err.Error()) } - serviceIdBytes, err := jam.Marshal(omega7) + // k = H(E4(s*) ⌢ µko..ko+kz) + serviceIdBytes, err := jam.Marshal(ss) if err != nil { return gas, regs, mem, polkavm.ErrPanicf(err.Error()) } @@ -135,18 +129,12 @@ func Read(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s service return gas, withCode(regs, NONE), mem, nil } - writeLen := int(math.Min(float64(bz), float64(len(v)))) - - if writeLen > 0 { - if err = mem.Write(uint32(bo), v[:writeLen]); err != nil { - return gas, withCode(regs, OOB), mem, nil - } - - regs[polkavm.A0] = uint64(len(v)) - return gas, regs, mem, nil + if err = writeFromOffset(mem, o, v, regs[polkavm.A4], regs[polkavm.A5]); err != nil { + return gas, regs, mem, err } - return gas, withCode(regs, NONE), mem, nil + regs[polkavm.A0] = uint64(len(v)) + return gas, regs, mem, nil } // Write ΩW(ϱ, ω, μ, s, s) @@ -164,12 +152,12 @@ func Write(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s servic keyData := make([]byte, kz) err := mem.Read(uint32(ko), keyData) if err != nil { - return gas, regs, mem, s, err + return gas, regs, mem, s, polkavm.ErrPanicf(err.Error()) } serviceIdBytes, err := jam.Marshal(serviceId) if err != nil { - return gas, regs, mem, s, err + return gas, regs, mem, s, polkavm.ErrPanicf(err.Error()) } hashInput := append(serviceIdBytes, keyData...) k := crypto.HashData(hashInput) @@ -179,9 +167,9 @@ func Write(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s servic delete(a.Storage, k) } else { valueData := make([]byte, vz) - err := mem.Read(uint32(vo), valueData) + err = mem.Read(uint32(vo), valueData) if err != nil { - return gas, withCode(regs, OOB), mem, s, err + return gas, regs, mem, s, polkavm.ErrPanicf(err.Error()) } a.Storage[k] = valueData @@ -193,7 +181,7 @@ func Write(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, s servic } if a.ThresholdBalance() > a.Balance { - return gas, withCode(regs, FULL), mem, s, err + return gas, withCode(regs, FULL), mem, s, nil } // otherwise a.ThresholdBalance() <= a.Balance @@ -232,11 +220,11 @@ func Info(gas polkavm.Gas, regs polkavm.Registers, mem polkavm.Memory, serviceId // E(tc, tb, tt, tg , tm, tl, ti) m, err := jam.Marshal(accountInfo) if err != nil { - return gas, regs, mem, polkavm.ErrPanicf(err.Error()) + return gas, regs, mem, err } - if err := mem.Write(uint32(omega8), m); err != nil { - return gas, withCode(regs, OOB), mem, nil + if err = mem.Write(uint32(omega8), m); err != nil { + return gas, regs, mem, polkavm.ErrPanicf(err.Error()) } return gas, withCode(regs, OK), mem, nil diff --git a/internal/polkavm/host_call/general_functions_test.go b/internal/polkavm/host_call/general_functions_test.go index 7272187..7e6c1e1 100644 --- a/internal/polkavm/host_call/general_functions_test.go +++ b/internal/polkavm/host_call/general_functions_test.go @@ -89,17 +89,18 @@ func TestLookup(t *testing.T) { bo := polkavm.RWAddressBase + 100 dataToHash := make([]byte, 32) copy(dataToHash, "hash") - hash := crypto.HashData(dataToHash) + err = mem.Write(ho, dataToHash) require.NoError(t, err) initialRegs[polkavm.A0] = uint64(serviceId) - initialRegs[polkavm.A1] = uint64(ho) - initialRegs[polkavm.A2] = uint64(bo) - initialRegs[polkavm.A3] = 32 + initialRegs[polkavm.A1] = uint64(ho) // h + initialRegs[polkavm.A2] = uint64(bo) // o + initialRegs[polkavm.A3] = 0 // f + initialRegs[polkavm.A4] = uint64(len(val)) // l sa := service.ServiceAccount{ - Storage: map[crypto.Hash][]byte{ - hash: val, + PreimageLookup: map[crypto.Hash][]byte{ + crypto.Hash(dataToHash): val, }, } serviceState := service.ServiceState{ @@ -147,7 +148,7 @@ func TestRead(t *testing.T) { value := []byte("value_to_read") // Compute the hash H(E4(s) || keyData) - serviceIdBytes, err := jam.Marshal(uint64(serviceId)) + serviceIdBytes, err := jam.Marshal(serviceId) require.NoError(t, err) hashInput := make([]byte, 0, len(serviceIdBytes)+len(keyData)) @@ -164,17 +165,18 @@ func TestRead(t *testing.T) { serviceId: sa, } - initialGas := uint64(100) - ko := polkavm.RWAddressBase bo := polkavm.RWAddressBase + 100 kz := uint32(len(keyData)) - bz := uint32(32) + vLen := uint64(len(value)) + initialRegs[polkavm.A0] = uint64(serviceId) initialRegs[polkavm.A1] = uint64(ko) initialRegs[polkavm.A2] = uint64(kz) initialRegs[polkavm.A3] = uint64(bo) - initialRegs[polkavm.A4] = uint64(bz) + initialRegs[polkavm.A4] = 0 // f = offset (starting at 0) + initialRegs[polkavm.A5] = vLen // l = length (32 bytes) + err = mem.Write(ko, keyData) require.NoError(t, err) diff --git a/internal/polkavm/host_call/refine_functions.go b/internal/polkavm/host_call/refine_functions.go index 741135b..e10da23 100644 --- a/internal/polkavm/host_call/refine_functions.go +++ b/internal/polkavm/host_call/refine_functions.go @@ -43,31 +43,23 @@ func HistoricalLookup( return gas, regs, mem, RefineContextPair{}, ErrAccountNotFound } - ho := regs[A1] - bo := regs[A2] - bz := regs[A3] + // let [h, o] = ω8..+2 + addressToRead, addressToWrite := regs[A1], regs[A2] hashData := make([]byte, 32) - if err := mem.Read(uint32(ho), hashData); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, err + if err := mem.Read(uint32(addressToRead), hashData); err != nil { + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } - // Compute hash H(µho..ho+32) - h := crypto.HashData(hashData) - // Compute v = Λ(a, t, h) using the provided LookupPreimage function - v := a.LookupPreimage(t, h) + v := a.LookupPreimage(t, crypto.Hash(hashData)) if len(v) == 0 { return gas, withCode(regs, NONE), mem, ctxPair, nil } - if uint64(len(v)) > bz { - return gas, withCode(regs, OOB), mem, ctxPair, nil - } - - if err := mem.Write(uint32(bo), v); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, err + if err := writeFromOffset(mem, addressToWrite, v, regs[A3], regs[A4]); err != nil { + return gas, regs, mem, ctxPair, err } // set ω7 to |v| @@ -119,7 +111,7 @@ func Export( data := make([]byte, z) if err := mem.Read(uint32(p), data); err != nil { // x = ∇ - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // Apply zero-padding Pn to data to make it WG-sized @@ -164,7 +156,7 @@ func Machine( err := mem.Read(uint32(po), p) if err != nil { // p = ∇ - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } // let n = min(n ∈ N, n ∉ K(m)) @@ -213,7 +205,7 @@ func Peek( // (ω′7, µ′) = (OK, µ′o...o+z = s) err = mem.Write(uint32(o), s) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } return gas, withCode(regs, OK), mem, ctxPair, nil @@ -242,7 +234,7 @@ func Poke( s := make([]byte, z) err := mem.Read(uint32(sReg), s) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } err = innerPVM.Ram.Write(uint32(o), s) @@ -271,7 +263,7 @@ func Zero( // p < 16 ∨ p + c ≥ 2^32 / ZP if p < 16 || p+c >= MaxPageIndex { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, withCode(regs, HUH), mem, ctxPair, nil } // u = m[n]u if n ∈ K(m), otherwise ∇ @@ -283,14 +275,14 @@ func Zero( for pageIndex := p; pageIndex < p+c; pageIndex++ { // (u′A)p..+c = [W, W, ...] if err := u.Ram.SetAccess(uint32(pageIndex), ReadWrite); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, err } // (u′V)pZP..+cZP = [0, 0, ...] start := uint32(pageIndex * uint64(PageSize)) zeroBuf := make([]byte, PageSize) if err := u.Ram.Write(start, zeroBuf); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, err } } @@ -319,27 +311,27 @@ func Void( } if p+c >= math.MaxUint32 { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, withCode(regs, HUH), mem, ctxPair, nil } for pageIndex := p; pageIndex < p+c; pageIndex++ { if u.Ram.GetAccess(uint32(pageIndex)) == Inaccessible { // ∃i ∈ N_{p..+c} : (uA)[i] = ∅ - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, withCode(regs, HUH), mem, ctxPair, nil } // (u′V)pZP..+cZP = [0, 0, ...] start := uint32(pageIndex * uint64(PageSize)) zeroBuf := make([]byte, PageSize) if err := u.Ram.Write(start, zeroBuf); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, err } } for pageIndex := p; pageIndex < p+c; pageIndex++ { // (u′A)p..+c = [∅, ∅, ...] if err := u.Ram.SetAccess(uint32(pageIndex), Inaccessible); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, err } } @@ -365,13 +357,13 @@ func Invoke( // let (g, w) = (g, w) ∶ E8(g) ⌢ E#8(w) = μo⋅⋅⋅+112 if No⋅⋅⋅+112 ⊂ V∗μ invokeGas, err := readNumber[Gas](mem, uint32(addr), 8) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } var invokeRegs Registers // w for i := range 13 { invokeReg, err := readNumber[uint64](mem, uint32(addr+(uint64(i+1)*8)), 8) if err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) } invokeRegs[i] = invokeReg } @@ -402,9 +394,9 @@ func Invoke( resultInstr, resultGas, resultRegs, resultMem, hostCall, invokeErr := interpreter.Invoke(program, pvm.InstructionCounter, invokeGas, invokeRegs, pvm.Ram) if bb, err := jam.Marshal([14]uint64(append([]uint64{uint64(resultGas)}, resultRegs[:]...))); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil // (OOB, ω8, μ, m) + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) // (panic, ω8, μ, m) } else if err := mem.Write(uint32(addr), bb); err != nil { - return gas, withCode(regs, OOB), mem, ctxPair, nil // (OOB, ω8, μ, m) + return gas, regs, mem, ctxPair, ErrPanicf(err.Error()) // (panic, ω8, μ, m) } if invokeErr != nil { if errors.Is(invokeErr, ErrOutOfGas) { diff --git a/internal/polkavm/host_call/refine_functions_test.go b/internal/polkavm/host_call/refine_functions_test.go index d8a8ef5..ecd2661 100644 --- a/internal/polkavm/host_call/refine_functions_test.go +++ b/internal/polkavm/host_call/refine_functions_test.go @@ -43,18 +43,16 @@ func TestHistoricalLookup(t *testing.T) { timeslot := jamtime.Timeslot(9) preimage := []byte("historical_data") - dataToHash := make([]byte, 32) - copy(dataToHash, preimage) - - h := crypto.HashData(dataToHash) + hashKey := make([]byte, 32) + copy(hashKey, preimage) sa := service.ServiceAccount{ PreimageLookup: map[crypto.Hash][]byte{ - h: preimage, + crypto.Hash(hashKey): preimage, }, PreimageMeta: map[service.PreImageMetaKey]service.PreimageHistoricalTimeslots{ { - Hash: h, + Hash: crypto.Hash(hashKey), Length: service.PreimageLength(len(preimage)), }: {0, 10}, }, @@ -64,19 +62,18 @@ func TestHistoricalLookup(t *testing.T) { serviceId: sa, } - hashData := make([]byte, 32) - copy(hashData, preimage) - ho := polkavm.RWAddressBase bo := polkavm.RWAddressBase + 100 - bz := uint32(64) + offset := uint64(0) + length := uint64(len(preimage)) initialRegs[polkavm.A0] = uint64(serviceId) initialRegs[polkavm.A1] = uint64(ho) initialRegs[polkavm.A2] = uint64(bo) - initialRegs[polkavm.A3] = uint64(bz) + initialRegs[polkavm.A3] = offset + initialRegs[polkavm.A4] = length - err = mem.Write(ho, hashData) + err = mem.Write(ho, hashKey[:]) require.NoError(t, err) ctxPair := polkavm.RefineContextPair{