Commit 5db1ffa5 authored by vipwzw's avatar vipwzw

开始添加账户相关的函数

parent 6aa5072a
package executor
import (
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
"github.com/robertkrimen/otto"
)
/*
//chain33 相关的账户操作函数 (操作某个execer 下面的 symbol)
function Account(execer, symbol) {
this.execer = execer
this.symbol = symbol
}
func Receipt(kvs, logs) {
this.kvs = kvs
this.logs = logs
}
var obj = new Account(execer, symbol)
//init 函数才能使用的两个函数(或者增发)
genesis_init(obj, addr string, amount int64)
genesis_init_exec(obj, execer, addr string, amount int64)
load_account(obj, addr) Account
get_balance(obj, addr, execer) Account
transfer(obj, from, to, amount) Receipt
transfer_to_exec(obj, execer, addr, amount) Receipt
withdraw(obj, execer, addr, amount) Receipt
exec_frozen(obj, addr) Receipt
exec_active(obj, addr) Receipt
exec_transfer(obj, from, to, amount) Receipt
exec_deposit(obj, addr, amount) Receipt
exec_withdraw(obj, addr, amount) Receipt
*/
func (u *js) getAccount(args otto.Value) (*account.DB, error) {
if !args.IsObject() {
return nil, types.ErrInvalidParam
}
obj := args.Object()
execer, err := getString(obj, "execer")
if err != nil {
return nil, err
}
symbol, err := getString(obj, "symbol")
if err != nil {
return nil, err
}
return account.NewAccountDB(execer, symbol, u.GetStateDB())
}
func (u *js) genesisInitExecFunc(vm *otto.Otto) {
vm.Set("genesis_init_exec", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
execer, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(2).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(3).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.GenesisInitExec(addr, amount, address.ExecAddress(execer))
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
func (u *js) genesisInitFunc(vm *otto.Otto) {
vm.Set("genesis_init", func(call otto.FunctionCall) otto.Value {
acc, err := u.getAccount(call.Argument(0))
if err != nil {
return errReturn(vm, err)
}
addr, err := call.Argument(1).ToString()
if err != nil {
return errReturn(vm, err)
}
if err := address.CheckAddress(addr); err != nil {
return errReturn(vm, err)
}
amount, err := call.Argument(2).ToInteger()
if err != nil {
return errReturn(vm, err)
}
receipt, err := acc.GenesisInit(addr, amount)
if err != nil {
return errReturn(vm, err)
}
return receiptReturn(vm, receipt)
})
}
...@@ -2,6 +2,7 @@ package executor ...@@ -2,6 +2,7 @@ package executor
import ( import (
"encoding/json" "encoding/json"
"fmt"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
drivers "github.com/33cn/chain33/system/dapp" drivers "github.com/33cn/chain33/system/dapp"
...@@ -173,7 +174,7 @@ func (u *js) getlocaldbFunc(vm *otto.Otto, name string) { ...@@ -173,7 +174,7 @@ func (u *js) getlocaldbFunc(vm *otto.Otto, name string) {
func (u *js) execnameFunc(vm *otto.Otto, name string) { func (u *js) execnameFunc(vm *otto.Otto, name string) {
vm.Set("execname", func(call otto.FunctionCall) otto.Value { vm.Set("execname", func(call otto.FunctionCall) otto.Value {
return okReturn(vm, name) return okReturn(vm, types.ExecName("user.js."+name))
}) })
} }
...@@ -244,13 +245,23 @@ func listReturn(vm *otto.Otto, value []string) otto.Value { ...@@ -244,13 +245,23 @@ func listReturn(vm *otto.Otto, value []string) otto.Value {
return newObject(vm).setValue("value", value).value() return newObject(vm).setValue("value", value).value()
} }
func receiptReturn(vm *otto.Otto, receipt *types.Receipt) otto.Value {
kvs := createKVObject(vm, receipt.KV)
logs := createLogsObject(vm, receipt.Logs)
return newObject(vm).setValue("kvs", kvs).setValue("logs", logs).value()
}
type object struct { type object struct {
vm *otto.Otto vm *otto.Otto
obj *otto.Object obj *otto.Object
} }
func newObject(vm *otto.Otto) *object { func newObject(vm *otto.Otto) *object {
obj, err := vm.Object("({})") return newObjectString(vm, "({})")
}
func newObjectString(vm *otto.Otto, value string) *object {
obj, err := vm.Object(value)
if err != nil { if err != nil {
panic(err) panic(err)
} }
...@@ -281,6 +292,28 @@ func (o *object) value() otto.Value { ...@@ -281,6 +292,28 @@ func (o *object) value() otto.Value {
return v return v
} }
func createKVObject(vm *otto.Otto, kvs []*types.KeyValue) otto.Value {
obj := newObjectString(vm, "([])")
for i := 0; i < len(kvs); i++ {
item := newObject(vm).setValue("key", string(kvs[i].Key))
item.setValue("value", string(kvs[i].Value))
item.setValue("prefix", true)
obj.setValue(fmt.Sprint(i), item)
}
return obj.value()
}
func createLogsObject(vm *otto.Otto, logs []*types.ReceiptLog) otto.Value {
obj := newObjectString(vm, "([])")
for i := 0; i < len(logs); i++ {
item := newObject(vm).setValue("ty", logs[i].Ty)
item.setValue("log", string(logs[i].Log))
item.setValue("format", "proto")
obj.setValue(fmt.Sprint(i), item)
}
return obj.value()
}
func (u *js) getstatedb(key string) (value string, err error) { func (u *js) getstatedb(key string) (value string, err error) {
s, err := u.GetStateDB().Get([]byte(key)) s, err := u.GetStateDB().Get([]byte(key))
value = string(s) value = string(s)
......
...@@ -18,33 +18,6 @@ func execaddressFunc(vm *otto.Otto) { ...@@ -18,33 +18,6 @@ func execaddressFunc(vm *otto.Otto) {
} }
/* /*
//chain33 相关的账户操作函数 (操作某个execer 下面的 symbol)
function Account(execer, symbol) {
this.execer = execer
this.symbol = symbol
}
func Receipt(kvs, logs) {
this.kvs = kvs
this.logs = logs
}
var obj = new Account(execer, symbol)
//init 函数才能使用的两个函数(或者增发)
genesis_init(obj, addr string, amount int64)
genesis_exec_init(obj, execer, addr string, amount int64)
load_account(obj, addr) Account
get_balance(obj, addr, execer) Account
transfer(obj, from, to, amount) Receipt
transfer_to_exec(obj, execer, addr, amount) Receipt
withdraw(obj, execer, addr, amount) Receipt
exec_frozen(obj, addr) Receipt
exec_active(obj, addr) Receipt
exec_transfer(obj, from, to, amount) Receipt
exec_deposit(obj, addr, amount) Receipt
exec_withdraw(obj, addr, amount) Receipt
//table //table
//要开发一个适合json的table, row 就是一个 js object //要开发一个适合json的table, row 就是一个 js object
//handle := new_table(config) //handle := new_table(config)
......
...@@ -44,6 +44,8 @@ var ( ...@@ -44,6 +44,8 @@ var (
ErrInvalidFuncPrefix = errors.New("chain33.js: invalid function prefix format") ErrInvalidFuncPrefix = errors.New("chain33.js: invalid function prefix format")
//ErrFuncNotFound 函数没有找到 //ErrFuncNotFound 函数没有找到
ErrFuncNotFound = errors.New("chain33.js: invalid function name not found") ErrFuncNotFound = errors.New("chain33.js: invalid function name not found")
ErrSymbolName = errors.New("chain33.js: ErrSymbolName")
ErrExecerName = errors.New("chain33.js: ErrExecerName")
) )
func init() { func init() {
......
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