Commit 5d7a8a13 authored by 袁兴强's avatar 袁兴强 Committed by vipwzw

support string parameter for wasm contracts

parent 7d52d0f3
......@@ -62,6 +62,7 @@ func cmdCallContract() *cobra.Command {
cmd.Flags().StringP("name", "n", "", "contract name")
cmd.Flags().StringP("method", "m", "", "method name")
cmd.Flags().IntSliceP("parameters", "p", nil, "parameters of the method which should be num")
cmd.Flags().StringSliceP("env", "v", nil, "string parameters set to environment")
_ = cmd.MarkFlagRequired("name")
_ = cmd.MarkFlagRequired("method")
return cmd
......@@ -114,6 +115,7 @@ func callContract(cmd *cobra.Command, args []string) {
name, _ := cmd.Flags().GetString("name")
method, _ := cmd.Flags().GetString("method")
parameters, _ := cmd.Flags().GetIntSlice("parameters")
env, _ := cmd.Flags().GetStringSlice("env")
var parameters2 []int64
for _, param := range parameters {
parameters2 = append(parameters2, int64(param))
......@@ -123,6 +125,7 @@ func callContract(cmd *cobra.Command, args []string) {
Contract: name,
Method: method,
Parameters: parameters2,
Env: env,
}
params := rpctypes.CreateTxIn{
Execer: wasmtypes.WasmX,
......
......@@ -60,8 +60,8 @@ wabt/bin/wasm2wat dice.wasm
### 调用合约
```bash
#其中参数为用逗号分隔的数字
./chain33-cli send wasm call -n 发布合约时指定的合约 -m 调用合约方法名 -p 参数 -k 用户私钥
#其中参数为用逗号分隔的数字列表,字符串参数为逗号分隔的字符串列表
./chain33-cli send wasm call -n 发布合约时指定的合约 -m 调用合约方法名 -p 参数 -v 字符串参数 -k 用户私钥
```
### 转账及提款
......
......@@ -33,6 +33,8 @@ int64_t getRandom();
void sha256(const char* data, size_t data_len, char* sum, size_t sum_len);
void printlog(const char* log, size_t len);
void printint(int64_t n);
size_t getENVSize(int64_t n);
size_t getENV(int64_t n);
#ifdef __cplusplus
}
......
......@@ -170,3 +170,11 @@ func printlog(s string) {
func sha256(data []byte) []byte {
return common.Sha256(data)
}
func getENVSize(n int) int {
return len(wasmCB.ENV[n])
}
func getENV(n int) string {
return wasmCB.ENV[n]
}
......@@ -113,6 +113,10 @@ func (w *Wasm) Exec_Call(payload *types2.WasmCall, tx *types.Transaction, index
w.contractName = payload.Contract
w.tx = tx
w.execAddr = address.ExecAddress(string(types.GetRealExecName(tx.Execer)))
w.ENV = make(map[int]string)
for i, v := range payload.Env {
w.ENV[i] = v
}
wasmCB = w
defer func() {
wasmCB = nil
......
......@@ -287,6 +287,21 @@ func (r *Resolver) ResolveFunc(module, field string) exec.FunctionImport {
copy(vm.Memory[sumPtr:sumPtr+sumLen], sha256(data))
return 0
}
case "getENVSize":
return func(vm *exec.VirtualMachine) int64 {
n := vm.GetCurrentFrame().Locals[0]
return int64(getENVSize(int(n)))
}
case "getENV":
return func(vm *exec.VirtualMachine) int64 {
n := vm.GetCurrentFrame().Locals[0]
valuePtr := int(uint32(vm.GetCurrentFrame().Locals[1]))
valueLen := int(uint32(vm.GetCurrentFrame().Locals[2]))
value := getENV(int(n))
copy(vm.Memory[valuePtr:valuePtr+valueLen], value)
return int64(len(value))
}
default:
log.Error("ResolveFunc", "unknown field", field)
......
......@@ -38,11 +38,13 @@ type Wasm struct {
execAddr string
contractName string
VMCache map[string]*exec.VirtualMachine
ENV map[int]string
}
func newWasm() drivers.Driver {
d := &Wasm{
VMCache: make(map[string]*exec.VirtualMachine),
ENV: make(map[int]string),
}
d.SetChild(d)
d.SetExecutorType(types.LoadExecutorType(driverName))
......
......@@ -19,6 +19,7 @@ message wasmCall {
string contract = 1;
string method = 2;
repeated int64 parameters = 3;
repeated string env = 4;
}
message queryCheckContract {
......
......@@ -5,9 +5,8 @@ package types
import (
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
......@@ -160,6 +159,7 @@ type WasmCall struct {
Contract string `protobuf:"bytes,1,opt,name=contract,proto3" json:"contract,omitempty"`
Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"`
Parameters []int64 `protobuf:"varint,3,rep,packed,name=parameters,proto3" json:"parameters,omitempty"`
Env []string `protobuf:"bytes,4,rep,name=env,proto3" json:"env,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -211,6 +211,13 @@ func (m *WasmCall) GetParameters() []int64 {
return nil
}
func (m *WasmCall) GetEnv() []string {
if m != nil {
return m.Env
}
return nil
}
type QueryCheckContract struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
......@@ -449,31 +456,30 @@ func init() {
proto.RegisterType((*LocalDataLog)(nil), "types.localDataLog")
}
func init() {
proto.RegisterFile("wasm.proto", fileDescriptor_7d78909ad64e3bbb)
}
func init() { proto.RegisterFile("wasm.proto", fileDescriptor_7d78909ad64e3bbb) }
var fileDescriptor_7d78909ad64e3bbb = []byte{
// 327 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x4f, 0x4b, 0xc3, 0x40,
0x10, 0xc5, 0x9b, 0xa6, 0x8d, 0xcd, 0x58, 0xac, 0x5d, 0xa4, 0x04, 0x0f, 0x1a, 0x16, 0x84, 0x80,
0xd0, 0x83, 0x8a, 0x17, 0x4f, 0x5a, 0x0f, 0x3d, 0x78, 0xda, 0xbb, 0xc2, 0xba, 0x5d, 0x6d, 0xe9,
0x26, 0x5b, 0x37, 0x13, 0x25, 0xdf, 0x5e, 0xf6, 0x4f, 0x25, 0x07, 0xf1, 0xe0, 0x6d, 0x66, 0xf6,
0x37, 0xef, 0x65, 0x66, 0x02, 0xf0, 0xc5, 0xeb, 0x72, 0xbe, 0x33, 0x1a, 0x35, 0x19, 0x62, 0xbb,
0x93, 0x35, 0x6d, 0x7d, 0xf1, 0x5e, 0xe0, 0x46, 0x57, 0xe4, 0x12, 0x12, 0x61, 0x24, 0x47, 0x99,
0x45, 0x79, 0x54, 0x1c, 0x5e, 0x4d, 0xe7, 0x8e, 0x9a, 0x5b, 0x64, 0xe1, 0x1e, 0x96, 0x3d, 0x16,
0x10, 0x72, 0x01, 0x03, 0xc1, 0x95, 0xca, 0xfa, 0x0e, 0x9d, 0x74, 0x51, 0xae, 0xd4, 0xb2, 0xc7,
0xdc, 0x33, 0x39, 0x82, 0x3e, 0xb6, 0x59, 0x9c, 0x47, 0xc5, 0x90, 0xf5, 0xb1, 0x7d, 0x38, 0x80,
0xe1, 0x27, 0x57, 0x8d, 0xa4, 0x37, 0xde, 0xda, 0xeb, 0x12, 0x02, 0x83, 0x8a, 0x97, 0xde, 0x38,
0x65, 0x2e, 0xb6, 0x35, 0xa1, 0x57, 0xd2, 0x39, 0x8c, 0x99, 0x8b, 0xe9, 0x0b, 0x8c, 0xf6, 0x16,
0xe4, 0x14, 0x46, 0x42, 0x57, 0x68, 0xb8, 0xc0, 0xd0, 0xf7, 0x93, 0x93, 0x19, 0x24, 0xa5, 0xc4,
0xb5, 0x5e, 0xb9, 0xee, 0x94, 0x85, 0x8c, 0x9c, 0x01, 0xec, 0xb8, 0xe1, 0xa5, 0x44, 0x69, 0xea,
0x2c, 0xce, 0xe3, 0x22, 0x66, 0x9d, 0x0a, 0x2d, 0x80, 0x7c, 0x34, 0xd2, 0xb4, 0x8b, 0xb5, 0x14,
0xdb, 0xc5, 0x5e, 0xed, 0x97, 0xaf, 0xa3, 0xe7, 0x90, 0x8a, 0xa6, 0x46, 0x5d, 0x3e, 0xe9, 0x77,
0x0b, 0x6c, 0xaa, 0x37, 0x9d, 0x45, 0x79, 0x6c, 0x01, 0x1b, 0xd3, 0x3b, 0x98, 0xfa, 0x55, 0xed,
0x65, 0x02, 0xf8, 0xe7, 0x9c, 0x69, 0x98, 0xf3, 0x19, 0x26, 0x76, 0x7d, 0xdd, 0xd6, 0xff, 0x8c,
0x3b, 0x83, 0xc4, 0xc8, 0xba, 0x51, 0x18, 0x2e, 0x10, 0x32, 0x7a, 0x0b, 0x63, 0xa5, 0x05, 0x57,
0x8f, 0x1c, 0xb9, 0xd5, 0x3e, 0x86, 0x78, 0x2b, 0x5b, 0x27, 0x3b, 0x66, 0x36, 0x24, 0x27, 0xe1,
0x4e, 0x61, 0xfb, 0x3e, 0x79, 0x4d, 0xdc, 0xdf, 0x73, 0xfd, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xc3,
0xc2, 0x9e, 0xbb, 0x4b, 0x02, 0x00, 0x00,
// 337 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0x31, 0x4f, 0xf3, 0x30,
0x10, 0x6d, 0xea, 0x36, 0x5f, 0x73, 0x5f, 0x45, 0x5b, 0x0b, 0x55, 0x11, 0x03, 0x44, 0x96, 0x90,
0x22, 0x21, 0x75, 0x00, 0xc4, 0xc2, 0x04, 0x65, 0xe8, 0xc0, 0xe4, 0x9d, 0xc1, 0xb8, 0x86, 0x56,
0x75, 0xe2, 0xe0, 0x5c, 0x8a, 0xf2, 0xef, 0x91, 0x1d, 0x17, 0x75, 0x40, 0x0c, 0x6c, 0xef, 0x9d,
0xdf, 0xbd, 0x97, 0xbb, 0x0b, 0xc0, 0xa7, 0xa8, 0x8b, 0x45, 0x65, 0x0d, 0x1a, 0x3a, 0xc4, 0xb6,
0x52, 0x35, 0x6b, 0xbb, 0xe2, 0x83, 0xc4, 0xad, 0x29, 0xe9, 0x15, 0xc4, 0xd2, 0x2a, 0x81, 0x2a,
0x8d, 0xb2, 0x28, 0xff, 0x7f, 0x3d, 0x5b, 0x78, 0xd5, 0xc2, 0x49, 0x96, 0xfe, 0x61, 0xd5, 0xe3,
0x41, 0x42, 0x2f, 0x61, 0x20, 0x85, 0xd6, 0x69, 0xdf, 0x4b, 0x27, 0xc7, 0x52, 0xa1, 0xf5, 0xaa,
0xc7, 0xfd, 0x33, 0x3d, 0x81, 0x3e, 0xb6, 0x29, 0xc9, 0xa2, 0x7c, 0xc8, 0xfb, 0xd8, 0x3e, 0xfe,
0x83, 0xe1, 0x5e, 0xe8, 0x46, 0xb1, 0xdb, 0x2e, 0xba, 0xf3, 0xa5, 0x14, 0x06, 0xa5, 0x28, 0xba,
0xe0, 0x84, 0x7b, 0xec, 0x6a, 0xd2, 0xac, 0x95, 0x4f, 0x18, 0x73, 0x8f, 0x59, 0x05, 0xa3, 0x43,
0x04, 0x3d, 0x83, 0x91, 0x34, 0x25, 0x5a, 0x21, 0x31, 0xf4, 0x7d, 0x73, 0x3a, 0x87, 0xb8, 0x50,
0xb8, 0x31, 0x6b, 0xdf, 0x9d, 0xf0, 0xc0, 0xe8, 0x39, 0x40, 0x25, 0xac, 0x28, 0x14, 0x2a, 0x5b,
0xa7, 0x24, 0x23, 0x39, 0xe1, 0x47, 0x15, 0x3a, 0x05, 0xa2, 0xca, 0x7d, 0x3a, 0xc8, 0x48, 0x9e,
0x70, 0x07, 0x59, 0x0e, 0xf4, 0xa3, 0x51, 0xb6, 0x5d, 0x6e, 0x94, 0xdc, 0x2d, 0x0f, 0xfe, 0x3f,
0x7c, 0x2f, 0xbb, 0x80, 0x44, 0x36, 0x35, 0x9a, 0xe2, 0xd9, 0xbc, 0x3b, 0xc1, 0xb6, 0x7c, 0x33,
0x69, 0xe4, 0x9d, 0x3c, 0x66, 0xf7, 0x30, 0xeb, 0x96, 0x77, 0xb0, 0x09, 0xc2, 0x5f, 0x27, 0x4f,
0xc2, 0xe4, 0x2f, 0x30, 0x71, 0x0b, 0x3d, 0x6e, 0xfd, 0xcb, 0x02, 0xe6, 0x10, 0x5b, 0x55, 0x37,
0x1a, 0xc3, 0x4d, 0x02, 0x63, 0x77, 0x30, 0xd6, 0x46, 0x0a, 0xfd, 0x24, 0x50, 0x38, 0xef, 0x29,
0x90, 0x9d, 0x6a, 0xbd, 0xed, 0x98, 0x3b, 0x48, 0x4f, 0xc3, 0xe5, 0xc2, 0x3d, 0x3a, 0xf2, 0x1a,
0xfb, 0xff, 0xe9, 0xe6, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x62, 0xf8, 0x3a, 0xae, 0x5d, 0x02, 0x00,
0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment