Skip to content

Commit

Permalink
add mini build
Browse files Browse the repository at this point in the history
  • Loading branch information
xuhongxin committed Oct 16, 2018
1 parent 38772f5 commit 1c27301
Show file tree
Hide file tree
Showing 10 changed files with 189 additions and 134 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,21 @@ Need Go version 1.11
```sh
cd $GOPATH/src/github.com/bytom-community/wasm
GOOS=js GOARCH=wasm go build -o main.wasm
GOOS=js GOARCH=wasm go build -tags=mini -o main.wasm #mini build
```


## WebAssembly JS Function
##### mini build
>createKey\
resetKeyPassword \
signTransaction1

##### default build
>createKey \
resetKeyPassword \
createAccount \
createAccountReceiver \
signTransaction \
signTransaction1

6 changes: 2 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package main

import (
"github.com/bytom-community/wasm/sdk"
)
import "github.com/bytom-community/wasm/sdk/js"

func main() {
done := make(chan struct{}, 0)
sdk.Register()
js.Register()
<-done
}
44 changes: 12 additions & 32 deletions sdk/key.go → sdk/base/key.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package sdk
package base

import (
"encoding/hex"
"syscall/js"

"github.com/bytom-community/wasm/sdk/lib"

"github.com/bytom-community/wasm/blockchain/pseudohsm"

"github.com/bytom-community/wasm/crypto/ed25519/chainkd"
"github.com/bytom-community/wasm/crypto/ed25519/ecmath"
"github.com/pborman/uuid"
)

Expand All @@ -21,15 +21,15 @@ type XKey struct {
}

//createKey create bytom key
func createKey(args []js.Value) {
defer endFunc(args[1]) //end func call
func CreateKey(args []js.Value) {
defer lib.EndFunc(args[1]) //end func call
auth := args[0].Get("auth").String()
if isEmpty(auth) {
if lib.IsEmpty(auth) {
args[1].Set("error", "auth empty")
return
}
alias := args[0].Get("alias").String()
if isEmpty(alias) {
if lib.IsEmpty(alias) {
args[1].Set("error", "alias empty")
return
}
Expand All @@ -55,13 +55,13 @@ func createKey(args []js.Value) {
args[1].Set("data", string(keyjson))
}

func resetKeyPassword(args []js.Value) {
func ResetKeyPassword(args []js.Value) {
rootXPub := args[0].Get("rootXPub").String()
oldPassword := args[0].Get("oldPassword").String()
newPassword := args[0].Get("newPassword").String()
if isEmpty(rootXPub) || isEmpty(oldPassword) || isEmpty(newPassword) {
if lib.IsEmpty(rootXPub) || lib.IsEmpty(oldPassword) || lib.IsEmpty(newPassword) {
args[1].Set("error", "empty pm")
endFunc(args[1])
lib.EndFunc(args[1])
return
}
xpub := new(chainkd.XPub)
Expand All @@ -70,7 +70,7 @@ func resetKeyPassword(args []js.Value) {
var then, catch js.Callback
then = js.NewCallback(func(a []js.Value) {
defer then.Release()
defer endFunc(args[1])
defer lib.EndFunc(args[1])
key, err := pseudohsm.DecryptKey([]byte(a[0].String()), oldPassword)
if err != nil {
args[1].Set("error", err.Error())
Expand All @@ -85,28 +85,8 @@ func resetKeyPassword(args []js.Value) {
})
catch = js.NewCallback(func(a []js.Value) {
defer catch.Release()
defer endFunc(args[1])
defer lib.EndFunc(args[1])
args[1].Set("error", a[0])
})
jsv.Call("then", then).Call("catch", catch)
}

//ScMulBase ed25519 scMulBase
func scMulBase(args []js.Value) {
defer endFunc(args[1]) //end func call
b, err := hex.DecodeString(args[0].String())
if err != nil {
args[1].Set("error", err.Error())
return
}
if len(b) != 32 {
args[1].Set("error", "error byte len")
return
}
var scalar ecmath.Scalar
copy(scalar[:], b[:32])
var P ecmath.Point
P.ScMulBase(&scalar)
buf := P.Encode()
args[1].Set("data", hex.EncodeToString(buf[:]))
}
77 changes: 7 additions & 70 deletions sdk/transaction.go → sdk/base/transaction.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,18 @@
package sdk
package base

import (
"context"
"encoding/hex"
"encoding/json"
"errors"
"syscall/js"

"github.com/bytom-community/wasm/sdk/lib"

"github.com/bytom-community/wasm/blockchain/pseudohsm"
"github.com/bytom-community/wasm/blockchain/txbuilder"
"github.com/bytom-community/wasm/crypto/ed25519/chainkd"
chainjson "github.com/bytom-community/wasm/encoding/json"
)

const getKeyByXPub = "getKeyByXPub"

type signResp struct {
Tx *txbuilder.Template `json:"transaction"`
SignComplete bool `json:"sign_complete"`
}

//Template server build struct
type Template struct {
Transaction string `json:"raw_transaction"`
Expand All @@ -35,12 +28,13 @@ type RespSign struct {
Signatures [][]string `json:"signatures"`
}

func signTransaction1(args []js.Value) {
defer endFunc(args[1])
//SignTransaction1 sign server transaction
func SignTransaction1(args []js.Value) {
defer lib.EndFunc(args[1])
transaction := args[0].Get("transaction").String()
password := args[0].Get("password").String()
keyJSON := args[0].Get("key").String()
if isEmpty(transaction) || isEmpty(password) || isEmpty(keyJSON) {
if lib.IsEmpty(transaction) || lib.IsEmpty(password) || lib.IsEmpty(keyJSON) {
args[1].Set("error", "args empty")
return
}
Expand Down Expand Up @@ -86,40 +80,6 @@ func signTransaction1(args []js.Value) {
args[1].Set("data", string(j))
}

func signTransaction(args []js.Value) {
defer endFunc(args[1])
transaction := args[0].Get("transaction").String()
password := args[0].Get("password").String()
keys := args[0].Get("keys").String()
if isEmpty(transaction) || isEmpty(password) || isEmpty(keys) {
args[1].Set("error", "args empty")
return
}
var tx txbuilder.Template
err := json.Unmarshal([]byte(transaction), &tx)
if err != nil {
args[1].Set("error", err.Error())
return
}
keysMap := make(map[string]string)
err = json.Unmarshal([]byte(keys), &keysMap)
if err != nil {
args[1].Set("error", err.Error())
return
}
if err := txbuilder.Sign(nil, &tx, password, getSignFunc(keysMap)); err != nil {
args[1].Set("error", err.Error())
return
}
sr := signResp{Tx: &tx, SignComplete: txbuilder.SignProgress(&tx)}
resp, err := json.Marshal(sr)
if err != nil {
args[1].Set("error", err.Error())
return
}
args[1].Set("data", string(resp))
}

func signServer(keyJSON string, path [][]byte, data [32]byte, password string) ([]byte, error) {
var (
err error
Expand All @@ -137,26 +97,3 @@ func signServer(keyJSON string, path [][]byte, data [32]byte, password string) (
}
return xprv.Sign(data[:]), nil
}

func getSignFunc(keys map[string]string) txbuilder.SignFunc {
return func(ctx context.Context, xpub chainkd.XPub, path [][]byte, data [32]byte, password string) ([]byte, error) {
var (
err error
key *pseudohsm.XKey
)
if keys, ok := keys[xpub.String()]; ok {
key, err = pseudohsm.DecryptKey([]byte(keys), password)
if err != nil {
return nil, err
}

xprv := key.XPrv
if len(path) > 0 {
xprv = key.XPrv.Derive(path)
}
return xprv.Sign(data[:]), nil
}

return nil, errors.New("not found keys")
}
}
38 changes: 38 additions & 0 deletions sdk/js/register.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// +build !mini

package js

import (
"syscall/js"

"github.com/bytom-community/wasm/sdk/standard"

"github.com/bytom-community/wasm/sdk/base"
)

//RegisterFunc Register js func
type RegisterFunc func(args []js.Value)

var funcs map[string]RegisterFunc

func init() {
funcs = make(map[string]RegisterFunc)

funcs["createKey"] = base.CreateKey
funcs["resetKeyPassword"] = base.ResetKeyPassword
funcs["createAccount"] = standard.CreateAccount
funcs["createAccountReceiver"] = standard.CreateAccountReceiver
funcs["signTransaction"] = standard.SignTransaction
funcs["signTransaction1"] = base.SignTransaction1
}

//Register Register func
func Register() {
jsFuncVal := js.Global().Get("AllFunc")
for k, v := range funcs {
call := js.NewCallback(v)
jsFuncVal.Set(k, call)
}
setPrintMessage := js.Global().Get("setFuncOver")
setPrintMessage.Invoke()
}
20 changes: 11 additions & 9 deletions sdk/register.go → sdk/js/register_mini.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package sdk
// +build mini

import "syscall/js"
package js

import (
"syscall/js"

"github.com/bytom-community/wasm/sdk/base"
)

//RegisterFunc Register js func
type RegisterFunc func(args []js.Value)
Expand All @@ -10,13 +16,9 @@ var funcs map[string]RegisterFunc
func init() {
funcs = make(map[string]RegisterFunc)

funcs["scMulBase"] = scMulBase
funcs["createKey"] = createKey
funcs["resetKeyPassword"] = resetKeyPassword
funcs["createAccount"] = createAccount
funcs["createAccountReceiver"] = createAccountReceiver
funcs["signTransaction"] = signTransaction
funcs["signTransaction1"] = signTransaction1
funcs["createKey"] = base.CreateKey
funcs["resetKeyPassword"] = base.ResetKeyPassword
funcs["signTransaction1"] = base.SignTransaction1
}

//Register Register func
Expand Down
14 changes: 0 additions & 14 deletions sdk/lib.go

This file was deleted.

16 changes: 16 additions & 0 deletions sdk/lib/lib.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package lib

import "syscall/js"

//EndFunc end call go func
func EndFunc(value js.Value) {
value.Call("endFunc")
}

//IsEmpty js value check empty
func IsEmpty(value string) bool {
if value == "" || value == "undefined" {
return true
}
return false
}
14 changes: 9 additions & 5 deletions sdk/account.go → sdk/standard/account.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package sdk
package standard

import (
"encoding/json"
"strings"
"syscall/js"

"github.com/bytom-community/wasm/sdk/lib"

"github.com/bytom-community/wasm/account"
"github.com/bytom-community/wasm/blockchain/signers"
"github.com/bytom-community/wasm/blockchain/txbuilder"
Expand All @@ -16,8 +18,9 @@ import (
"github.com/bytom-community/wasm/protocol/vm/vmutil"
)

func createAccount(args []js.Value) {
defer endFunc(args[1])
//CreateAccount create account
func CreateAccount(args []js.Value) {
defer lib.EndFunc(args[1])
var (
alias string
quorum int
Expand Down Expand Up @@ -53,8 +56,9 @@ func createAccount(args []js.Value) {
args[1].Set("data", string(rawAccount))
}

func createAccountReceiver(args []js.Value) {
defer endFunc(args[1])
//CreateAccountReceiver create address by account
func CreateAccountReceiver(args []js.Value) {
defer lib.EndFunc(args[1])
var (
acc account.Account
err error
Expand Down
Loading

0 comments on commit 1c27301

Please sign in to comment.