Skip to content

Commit

Permalink
Updated to use extension hash rather than name in wasm fns
Browse files Browse the repository at this point in the history
Signed-off-by: Jimmy Moore <[email protected]>
  • Loading branch information
jimmyaxod committed Oct 9, 2023
1 parent c22584a commit 78fd77a
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 93 deletions.
10 changes: 8 additions & 2 deletions extension/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func GenerateGuestLocal(options *Options) (*GuestLocalPackage, error) {
return nil, err
}

golangGuest, err := golang.GenerateGuest(options.Extension, options.GolangPackageName, options.GolangPackageVersion)
golangGuest, err := golang.GenerateGuest(options.Extension, hashString, options.GolangPackageName, options.GolangPackageVersion)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -125,12 +125,18 @@ func GenerateGuestLocal(options *Options) (*GuestLocalPackage, error) {
}

func GenerateHostLocal(options *Options) (*HostLocalPackage, error) {
hash, err := options.Extension.Hash()
if err != nil {
return nil, err
}
hashString := hex.EncodeToString(hash)

golangTypes, err := golang.GenerateTypes(options.Extension, options.GolangPackageName)
if err != nil {
return nil, err
}

golangHost, err := golang.GenerateHost(options.Extension, options.GolangPackageName, options.GolangPackageVersion)
golangHost, err := golang.GenerateHost(options.Extension, hashString, options.GolangPackageName, options.GolangPackageVersion)
if err != nil {
return nil, err
}
Expand Down
26 changes: 14 additions & 12 deletions extension/generator/golang/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,16 @@ func GenerateInterfaces(schema *extension.Schema, packageName string, version st
return generator.GenerateInterfaces(schema, packageName, version)
}

func GenerateGuest(schema *extension.Schema, packageName string, version string) ([]byte, error) {
return generator.GenerateGuest(schema, packageName, version)
func GenerateGuest(schema *extension.Schema, extensionHash string, packageName string, version string) ([]byte, error) {
return generator.GenerateGuest(schema, extensionHash, packageName, version)
}

func GenerateModfile(packageName string) ([]byte, error) {
return generator.GenerateModfile(packageName)
}

func GenerateHost(schema *extension.Schema, packageName string, version string) ([]byte, error) {
return generator.GenerateHost(schema, packageName, version)
func GenerateHost(schema *extension.Schema, extensionHash string, packageName string, version string) ([]byte, error) {
return generator.GenerateHost(schema, extensionHash, packageName, version)
}

func init() {
Expand Down Expand Up @@ -122,16 +122,17 @@ func (g *Generator) GenerateInterfaces(schema *extension.Schema, packageName str
}

// GenerateGuest generates the guest bindings
func (g *Generator) GenerateGuest(schema *extension.Schema, packageName string, version string) ([]byte, error) {
func (g *Generator) GenerateGuest(schema *extension.Schema, schemaHash string, packageName string, version string) ([]byte, error) {
if packageName == "" {
packageName = defaultPackageName
}

buf := new(bytes.Buffer)
err := g.templ.ExecuteTemplate(buf, "guest.go.templ", map[string]any{
"schema": schema,
"version": version,
"package": packageName,
"extension_schema": schema,
"extension_hash": schemaHash,
"version": version,
"package": packageName,
})
if err != nil {
return nil, err
Expand All @@ -156,16 +157,17 @@ func (g *Generator) GenerateModfile(packageImportPath string) ([]byte, error) {
}

// GenerateHost generates the host bindings
func (g *Generator) GenerateHost(schema *extension.Schema, packageName string, version string) ([]byte, error) {
func (g *Generator) GenerateHost(schema *extension.Schema, schemaHash string, packageName string, version string) ([]byte, error) {
if packageName == "" {
packageName = defaultPackageName
}

buf := new(bytes.Buffer)
err := g.templ.ExecuteTemplate(buf, "host.go.templ", map[string]any{
"schema": schema,
"version": version,
"package": packageName,
"extension_schema": schema,
"extension_hash": schemaHash,
"version": version,
"package": packageName,
})
if err != nil {
return nil, err
Expand Down
12 changes: 8 additions & 4 deletions extension/generator/golang/generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package golang

import (
"encoding/hex"
"os"
"testing"

Expand Down Expand Up @@ -48,16 +49,19 @@ func TestGenerator(t *testing.T) {
require.NoError(t, err)
require.Equal(t, string(expTypes), string(formatted))

host, err := GenerateHost(s, packageName, "v0.1.0")
sHash, err := s.Hash()

Check failure on line 52 in extension/generator/golang/generator_test.go

View workflow job for this annotation

GitHub Actions / golang

ineffectual assignment to err (ineffassign)
hash := hex.EncodeToString(sHash)

host, err := GenerateHost(s, hash, packageName, "v0.1.0")
require.NoError(t, err)
// os.WriteFile("./host.txt", host, 0644)
os.WriteFile("./host.txt", host, 0644)
expHost, err := os.ReadFile("./host.txt")
require.NoError(t, err)
require.Equal(t, string(expHost), string(host))

guest, err := GenerateGuest(s, packageName, "v0.1.0")
guest, err := GenerateGuest(s, hash, packageName, "v0.1.0")
require.NoError(t, err)
// os.WriteFile("./guest.txt", guest, 0644)
os.WriteFile("./guest.txt", guest, 0644)
expGuest, err := os.ReadFile("./guest.txt")
require.NoError(t, err)
require.Equal(t, string(expGuest), string(guest))
Expand Down
36 changes: 19 additions & 17 deletions extension/generator/golang/templates/guest.go.templ
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
// Code generated by scale-extension {{ .version }}, DO NOT EDIT.
// schema: {{ .schema.Name }}:{{ .schema.Tag }}
// schema: {{ .extension_schema.Name }}:{{ .extension_schema.Tag }}
// output: {{ .package }}

{{ $hash := .extension_hash }}

package {{ .package }}

import (
Expand All @@ -14,9 +16,9 @@ var (
readBuffer []byte
)

//export ext_{{ .schema.Name }}_Resize
//go:linkname ext_{{ .schema.Name }}_Resize
func ext_{{ .schema.Name }}_Resize(size uint32) uint32 {
//export ext_{{ $hash }}_Resize
//go:linkname ext_{{ $hash }}_Resize
func ext_{{ $hash }}_Resize(size uint32) uint32 {
readBuffer = make([]byte, size)
//if uint32(cap(readBuffer)) < size {
// readBuffer = append(make([]byte, 0, uint32(len(readBuffer))+size), readBuffer...)
Expand All @@ -25,12 +27,12 @@ func ext_{{ .schema.Name }}_Resize(size uint32) uint32 {
return uint32(uintptr(unsafe.Pointer(&readBuffer[0])))
}

{{ $schema := .schema }}
{{ $schema := .extension_schema }}

// Define any interfaces we need here...
// Also define structs we can use to hold instanceId

{{ range $ifc := .schema.Interfaces }}
{{ range $ifc := .extension_schema.Interfaces }}

// Define concrete types with a hidden instanceId

Expand All @@ -54,7 +56,7 @@ func (d *_{{ $ifc.Name }}) {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Retu

{{- if (IsInterface $schema $fn.Return) }}
readBuffer = nil
v := ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}(d.instanceId, off, l)
v := ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}(d.instanceId, off, l)
// IF the return type is an interface return ifc, which contains hidden instanceId.

// Handle error from host. In this case there'll be an error in the readBuffer
Expand All @@ -72,7 +74,7 @@ func (d *_{{ $ifc.Name }}) {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Retu

return ret, nil
{{ else }}
ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}(d.instanceId, off, l)
ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}(d.instanceId, off, l)
// IF the return type is a model, we should read the data from the read buffer.

ret := &{{ $fn.Return }}{}
Expand All @@ -86,21 +88,21 @@ func (d *_{{ $ifc.Name }}) {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Retu
{{ end }}
}

//export ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}
//go:linkname ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}
func ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}(instance uint64, offset uint32, length uint32) uint64
//export ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}
//go:linkname ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}
func ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}(instance uint64, offset uint32, length uint32) uint64

{{ end }}

{{ end }}

// Define any global functions here...

{{ range $fn := .schema.Functions }}
{{ range $fn := .extension_schema.Functions }}

//export ext_{{ $schema.Name }}_{{ $fn.Name }}
//go:linkname ext_{{ $schema.Name }}_{{ $fn.Name }}
func ext_{{ $schema.Name }}_{{ $fn.Name }}(instance uint64, offset uint32, length uint32) uint64
//export ext_{{ $hash }}_{{ $fn.Name }}
//go:linkname ext_{{ $hash }}_{{ $fn.Name }}
func ext_{{ $hash }}_{{ $fn.Name }}(instance uint64, offset uint32, length uint32) uint64

func {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Return }}, error) {
// First we take the params, serialize them.
Expand All @@ -116,7 +118,7 @@ func {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Return }}, error) {

{{- if (IsInterface $schema $fn.Return) }}
readBuffer = nil
v := ext_{{ $schema.Name }}_{{ $fn.Name }}(0, off, l)
v := ext_{{ $hash }}_{{ $fn.Name }}(0, off, l)
// IF the return type is an interface return ifc, which contains hidden instanceId.

// Handle error from host. In this case there'll be an error in the readBuffer
Expand All @@ -134,7 +136,7 @@ func {{ $fn.Name }}(params *{{ $fn.Params }}) ({{ $fn.Return }}, error) {

return ret, nil
{{ else }}
ext_{{ $schema.Name }}_{{ $fn.Name }}(0, off, l)
ext_{{ $hash }}_{{ $fn.Name }}(0, off, l)
// IF the return type is a model, we should read the data from the read buffer.

ret := &{{ $fn.Return }}{}
Expand Down
39 changes: 20 additions & 19 deletions extension/generator/golang/templates/host.go.templ
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
// Code generated by scale-extension {{ .version }}, DO NOT EDIT.
// schema: {{ .schema.Name }}:{{ .schema.Tag }}
// schema: {{ .extension_schema.Name }}:{{ .extension_schema.Tag }}
// output: {{ .package }}

{{ $schema := .extension_schema }}
{{ $hash := .extension_hash }}

package {{ .package }}

import (
Expand All @@ -13,14 +16,14 @@ import (
extension "github.com/loopholelabs/scale-extension-interfaces"
)

const identifier = "{{ .schema.Name }}:{{ .schema.Tag }}"
const identifier = "{{ .extension_schema.Name }}:{{ .extension_schema.Tag }}"

// Write an error to the scale function guest buffer.
func hostError(mem extension.ModuleMemory, resize extension.Resizer, err error) {
b := polyglot.NewBuffer()
polyglot.Encoder(b).Error(err)

writeBuffer, err := resize("ext_HttpFetch_Resize", uint64(b.Len()))
writeBuffer, err := resize("ext_{{ $hash }}_Resize", uint64(b.Len()))

if err != nil {
panic(err)
Expand All @@ -31,11 +34,9 @@ func hostError(mem extension.ModuleMemory, resize extension.Resizer, err error)
}
}

{{ $schema := .schema }}

type hostExt struct {
functions map[string]extension.InstallableFunc
host *{{ .schema.Name }}Host
host *{{ .extension_schema.Name }}Host
}

func (he *hostExt) Init() map[string]extension.InstallableFunc {
Expand All @@ -44,27 +45,27 @@ func (he *hostExt) Init() map[string]extension.InstallableFunc {

func (he *hostExt) Reset() {
// Reset any instances that have been created.
{{ range $ifc := .schema.Interfaces }}
{{ range $ifc := .extension_schema.Interfaces }}
he.host.instances_{{ $ifc.Name }} = make(map[uint64]{{ $ifc.Name }})
{{ end }}
}

func New(impl {{ .schema.Name }}Ifc) extension.Extension {
hostWrapper := &{{ .schema.Name }}Host{ impl: impl }
func New(impl {{ .extension_schema.Name }}Ifc) extension.Extension {
hostWrapper := &{{ .extension_schema.Name }}Host{ impl: impl }

fns := make(map[string]extension.InstallableFunc)

// Add global functions to the runtime
{{ range $fn := .schema.Functions }}
fns["ext_{{ $schema.Name }}_{{ $fn.Name }}"] = hostWrapper.host_ext_{{ $schema.Name }}_{{ $fn.Name }}
{{ range $fn := .extension_schema.Functions }}
fns["ext_{{ $hash }}_{{ $fn.Name }}"] = hostWrapper.host_ext_{{ $schema.Name }}_{{ $fn.Name }}
{{ end }}

{{ range $ifc := .schema.Interfaces }}
{{ range $ifc := .extension_schema.Interfaces }}
hostWrapper.instances_{{ $ifc.Name }} = make(map[uint64]{{ $ifc.Name }})

{{ range $fn := $ifc.Functions }}

fns["ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}"] = hostWrapper.host_ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}
fns["ext_{{ $hash }}_{{ $ifc.Name }}_{{ $fn.Name }}"] = hostWrapper.host_ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{ $fn.Name }}

{{ end }}
{{ end }}
Expand All @@ -75,9 +76,9 @@ func New(impl {{ .schema.Name }}Ifc) extension.Extension {
}
}

type {{ .schema.Name }}Host struct {
impl {{ .schema.Name }}Ifc
{{ range $ifc := .schema.Interfaces }}
type {{ .extension_schema.Name }}Host struct {
impl {{ .extension_schema.Name }}Ifc
{{ range $ifc := .extension_schema.Interfaces }}

gid_{{ $ifc.Name }} uint64
instancesLock_{{ $ifc.Name }} sync.Mutex
Expand All @@ -88,7 +89,7 @@ type {{ .schema.Name }}Host struct {
}

// Global functions
{{ range $fn := .schema.Functions }}
{{ range $fn := .extension_schema.Functions }}

func (h *{{ $schema.Name }}Host) host_ext_{{ $schema.Name }}_{{ $fn.Name}}(mem extension.ModuleMemory, resize extension.Resizer, params []uint64) {

Expand Down Expand Up @@ -143,7 +144,7 @@ func (h *{{ $schema.Name }}Host) host_ext_{{ $schema.Name }}_{{ $fn.Name}}(mem e
{{ end }}


{{ range $ifc := .schema.Interfaces }}
{{ range $ifc := .extension_schema.Interfaces }}

{{ range $fn := $ifc.Functions }}

Expand Down Expand Up @@ -189,7 +190,7 @@ func (h *{{ $schema.Name }}Host) host_ext_{{ $schema.Name }}_{{ $ifc.Name }}_{{
b := polyglot.NewBuffer()
resp.Encode(b)

writeBuffer, err := resize("ext_{{ $schema.Name }}_Resize", uint64(b.Len()))
writeBuffer, err := resize("ext_{{ $hash }}_Resize", uint64(b.Len()))

if err != nil {
hostError(mem, resize, err)
Expand Down
2 changes: 1 addition & 1 deletion extension/generator/rust/generated.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Code generated by scale-extension 0.4.1, DO NOT EDIT.
// Code generated by scale-extension 0.4.2, DO NOT EDIT.
// output: types

#![allow(dead_code)]
Expand Down
7 changes: 2 additions & 5 deletions extension/generator/rust/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ package rust
import (
"bytes"
"context"
"fmt"
"strings"
"text/template"

Expand Down Expand Up @@ -50,8 +49,8 @@ func GenerateCargofile(packageName string, packageVersion string) ([]byte, error
return generator.GenerateCargofile(packageName, packageVersion)
}

func GenerateGuest(extensionSchema *extension.Schema, signatureHash string, packageName string) ([]byte, error) {
return generator.GenerateGuest(extensionSchema, signatureHash, packageName)
func GenerateGuest(extensionSchema *extension.Schema, extensionHash string, packageName string) ([]byte, error) {
return generator.GenerateGuest(extensionSchema, extensionHash, packageName)
}

func init() {
Expand Down Expand Up @@ -145,8 +144,6 @@ func (g *Generator) GenerateGuest(extensionSchema *extension.Schema, extensionHa
packageName = defaultPackageName
}

fmt.Printf("Generating guest...\n")

buf := new(bytes.Buffer)
err := g.templ.ExecuteTemplate(buf, "guest.rs.templ", map[string]any{
"extension_schema": extensionSchema,
Expand Down
Loading

0 comments on commit 78fd77a

Please sign in to comment.