Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[x/programs] add program abstraction #660

Merged
merged 29 commits into from
Jan 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c71e603
Move fixtures into tests directory
hexfusion Dec 14, 2023
903fefe
Abstract engine from runtime
hexfusion Dec 14, 2023
ff0adb6
React to changes
hexfusion Dec 14, 2023
cea5ea5
Nits
hexfusion Dec 15, 2023
f25a144
Review comments
hexfusion Dec 21, 2023
29d3bbe
Clarify debug mode
hexfusion Dec 21, 2023
a75af73
Nit
hexfusion Dec 21, 2023
3d03b4c
Add host abstraction
hexfusion Dec 15, 2023
2b7ba48
React to changes
hexfusion Dec 15, 2023
3ac1a3f
Cleanup
hexfusion Dec 21, 2023
195c96a
Move program from runtime
hexfusion Dec 22, 2023
af1201b
Add program abstraction
hexfusion Dec 22, 2023
597ff1a
Implement runtime instance and react to changes
hexfusion Dec 22, 2023
2fbdc8e
Nit
hexfusion Dec 22, 2023
fa5565d
Add RegisterImportWrapFn
hexfusion Dec 22, 2023
7485e7c
Update examples
hexfusion Dec 22, 2023
e1bbfc4
Show example of wrap import function impl
hexfusion Dec 22, 2023
8dbe3ed
Remove stale docs
hexfusion Dec 22, 2023
678a8cb
Impliment pstate with wrap functionality
hexfusion Dec 22, 2023
7e5f311
license header lint
samliok Dec 27, 2023
95aa598
remove hardcoded wrapper funcitons, fixed pstate bugs
samliok Jan 6, 2024
13ff0a6
lint
samliok Jan 6, 2024
cee952c
lint
samliok Jan 6, 2024
5c359d9
Merge branch 'dynamic_args' into refactor-statekey
samliok Jan 6, 2024
15b84b5
Revert "Merge branch 'dynamic_args' into refactor-statekey"
samliok Jan 6, 2024
3a23ebb
Revert "Revert "Merge branch 'dynamic_args' into refactor-statekey""
samliok Jan 6, 2024
7f323b2
lint
samliok Jan 6, 2024
b5e64fb
memory tests
samliok Jan 6, 2024
d175d2c
create WAT program instead of memory.wasm
samliok Jan 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions x/programs/examples/counter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,17 @@ func TestCounterProgram(t *testing.T) {
err = storage.SetProgram(ctx, db, programID, wasmBytes)
require.NoError(err)

programIDPtr, err := argumentToSmartPtr(programID, rt.Memory())
mem, err := rt.Memory()
require.NoError(err)
programIDPtr, err := argumentToSmartPtr(programID, mem)
require.NoError(err)

// generate alice keys
_, aliceKey, err := newKey()
require.NoError(err)

// write alice's key to stack and get pointer
alicePtr, err := argumentToSmartPtr(aliceKey, rt.Memory())
alicePtr, err := argumentToSmartPtr(aliceKey, mem)
require.NoError(err)

// create counter for alice on program 1
Expand Down Expand Up @@ -105,11 +107,13 @@ func TestCounterProgram(t *testing.T) {
err = storage.SetProgram(ctx, db, program2ID, wasmBytes)
require.NoError(err)

programID2Ptr, err := argumentToSmartPtr(program2ID, rt2.Memory())
mem2, err := rt2.Memory()
require.NoError(err)
programID2Ptr, err := argumentToSmartPtr(program2ID, mem2)
require.NoError(err)

// write alice's key to stack and get pointer
alicePtr2, err := argumentToSmartPtr(aliceKey, rt2.Memory())
alicePtr2, err := argumentToSmartPtr(aliceKey, mem2)
require.NoError(err)

// initialize counter for alice on runtime 2
Expand All @@ -119,7 +123,7 @@ func TestCounterProgram(t *testing.T) {

// increment alice's counter on program 2 by 10
incAmount := int64(10)
incAmountPtr, err := argumentToSmartPtr(incAmount, rt2.Memory())
incAmountPtr, err := argumentToSmartPtr(incAmount, mem2)
require.NoError(err)
result, err = rt2.Call(ctx, "inc", programID2Ptr, alicePtr2, incAmountPtr)
require.NoError(err)
Expand All @@ -137,7 +141,7 @@ func TestCounterProgram(t *testing.T) {
require.NoError(err)

// increment alice's counter on program 1
onePtr, err := argumentToSmartPtr(int64(1), rt.Memory())
onePtr, err := argumentToSmartPtr(int64(1), mem)
require.NoError(err)
result, err = rt.Call(ctx, "inc", programIDPtr, alicePtr, onePtr)
require.NoError(err)
Expand All @@ -151,17 +155,17 @@ func TestCounterProgram(t *testing.T) {
)

// write program id 2 to stack of program 1
programID2Ptr, err = argumentToSmartPtr(program2ID, rt.Memory())
programID2Ptr, err = argumentToSmartPtr(program2ID, mem)
require.NoError(err)

caller := programIDPtr
target := programID2Ptr
maxUnitsProgramToProgram := int64(10000)
maxUnitsProgramToProgramPtr, err := argumentToSmartPtr(maxUnitsProgramToProgram, rt.Memory())
maxUnitsProgramToProgramPtr, err := argumentToSmartPtr(maxUnitsProgramToProgram, mem)
require.NoError(err)

// increment alice's counter on program 2
fivePtr, err := argumentToSmartPtr(int64(5), rt.Memory())
fivePtr, err := argumentToSmartPtr(int64(5), mem)
require.NoError(err)
result, err = rt.Call(ctx, "inc_external", caller, target, maxUnitsProgramToProgramPtr, alicePtr, fivePtr)
require.NoError(err)
Expand Down
33 changes: 0 additions & 33 deletions x/programs/examples/imports/README.md

This file was deleted.

42 changes: 30 additions & 12 deletions x/programs/examples/imports/program/program.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/ava-labs/hypersdk/x/programs/engine"
"github.com/ava-labs/hypersdk/x/programs/examples/storage"
"github.com/ava-labs/hypersdk/x/programs/host"
"github.com/ava-labs/hypersdk/x/programs/program"
"github.com/ava-labs/hypersdk/x/programs/runtime"
)

Expand Down Expand Up @@ -58,7 +59,7 @@ func (i *Import) Register(link *host.Link) error {

// callProgramFn makes a call to an entry function of a program in the context of another program's ID.
func (i *Import) callProgramFn(
caller *wasmtime.Caller,
wasmCaller *wasmtime.Caller,
callerID int64,
programID int64,
maxUnits int64,
Expand All @@ -68,17 +69,25 @@ func (i *Import) callProgramFn(
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

memory := runtime.NewMemory(runtime.NewExportClient(caller))
caller := program.NewCaller(wasmCaller)
memory, err := caller.Memory()
if err != nil {
i.log.Error("failed to get memory from caller",
zap.Error(err),
)
return -1
}

// get the entry function for invoke to call.
functionBytes, err := runtime.SmartPtr(function).Bytes(memory)
functionBytes, err := program.SmartPtr(function).Bytes(memory)
if err != nil {
i.log.Error("failed to read function name from memory",
zap.Error(err),
)
return -1
}

programIDBytes, err := runtime.SmartPtr(programID).Bytes(memory)
programIDBytes, err := program.SmartPtr(programID).Bytes(memory)
if err != nil {
i.log.Error("failed to read id from memory",
zap.Error(err),
Expand Down Expand Up @@ -133,15 +142,24 @@ func (i *Import) callProgramFn(
}
}()

argsBytes, err := runtime.SmartPtr(args).Bytes(memory)
argsBytes, err := program.SmartPtr(args).Bytes(memory)
if err != nil {
i.log.Error("failed to read program args name from memory",
zap.Error(err),
)
return -1
}

rtMemory, err := rt.Memory()
if err != nil {
i.log.Error("failed to get memory from runtime",
zap.Error(err),
)
return -1
}

// sync args to new runtime and return arguments to the invoke call
params, err := getCallArgs(ctx, rt.Memory(), argsBytes, programIDBytes)
params, err := getCallArgs(ctx, rtMemory, argsBytes, programIDBytes)
if err != nil {
i.log.Error("failed to unmarshal call arguments",
zap.Error(err),
Expand All @@ -162,18 +180,18 @@ func (i *Import) callProgramFn(
}

// getCallArgs returns the arguments to be passed to the program being invoked from [buffer].
func getCallArgs(ctx context.Context, memory runtime.Memory, buffer []byte, programIDBytes []byte) ([]runtime.SmartPtr, error) {
func getCallArgs(ctx context.Context, memory *program.Memory, buffer []byte, programIDBytes []byte) ([]program.SmartPtr, error) {
// first arg contains id of program to call
invokeProgramIDPtr, err := runtime.WriteBytes(memory, programIDBytes)
invokeProgramIDPtr, err := program.WriteBytes(memory, programIDBytes)
if err != nil {
return nil, err
}
argPtr, err := runtime.NewSmartPtr(uint32(invokeProgramIDPtr), len(programIDBytes))
argPtr, err := program.NewSmartPtr(uint32(invokeProgramIDPtr), len(programIDBytes))
if err != nil {
return nil, err
}

args := []runtime.SmartPtr{argPtr}
args := []program.SmartPtr{argPtr}

for i := 0; i < len(buffer); {
// unpacks uint32
Expand All @@ -184,11 +202,11 @@ func getCallArgs(ctx context.Context, memory runtime.Memory, buffer []byte, prog
i += int(length) + consts.Uint32Len

// every argument is a pointer
ptr, err := runtime.WriteBytes(memory, valueBytes)
ptr, err := program.WriteBytes(memory, valueBytes)
if err != nil {
return nil, err
}
argPtr, err := runtime.NewSmartPtr(uint32(ptr), int(length))
argPtr, err := program.NewSmartPtr(uint32(ptr), int(length))
if err != nil {
return nil, err
}
Expand Down
Loading
Loading