1 Star 0 Fork 0

艾鸥科技 / go-aiou

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
blockchain.go 3.84 KB
一键复制 编辑 原始数据 按行查看 历史
张卓 提交于 2020-05-10 14:55 . init
package v8
/*
#include "v8/vm.h"
*/
import "C"
import (
"encoding/json"
"errors"
"gitee.com/aiou-official/go-aiou/core/global"
"gitee.com/aiou-official/go-aiou/vm/host"
)
var (
// ErrGetSandbox error when GetSandbox failed.
ErrGetSandbox = errors.New("get sandbox failed")
)
func newCStr(str string) C.CStr {
cstr := C.CStr{}
cstr.data = C.CString(str)
cstr.size = C.int(len(str))
return cstr
}
func (cstr *C.CStr) SetString(str string) {
cstr.data = C.CString(str)
cstr.size = C.int(len(str))
}
func (cstr C.CStr) GoString() string {
return C.GoStringN(cstr.data, cstr.size)
}
//export goBlockInfo
func goBlockInfo(cSbx C.SandboxPtr, info *C.CStr, gasUsed *C.size_t) *C.char {
sbx, ok := GetSandbox(cSbx)
if !ok {
return C.CString(ErrGetSandbox.Error())
}
blkInfo, cost := sbx.host.BlockInfo()
*gasUsed = C.size_t(cost.CPU)
info.SetString(string(blkInfo))
return nil
}
//export goTxInfo
func goTxInfo(cSbx C.SandboxPtr, info *C.CStr, gasUsed *C.size_t) *C.char {
sbx, ok := GetSandbox(cSbx)
if !ok {
return C.CString(ErrGetSandbox.Error())
}
txInfo, cost := sbx.host.TxInfo()
*gasUsed = C.size_t(cost.CPU)
info.SetString(string(txInfo))
return nil
}
//export goContextInfo
func goContextInfo(cSbx C.SandboxPtr, info *C.CStr, gasUsed *C.size_t) *C.char {
sbx, ok := GetSandbox(cSbx)
if !ok {
return C.CString(ErrGetSandbox.Error())
}
ctxInfo, cost := sbx.host.ContextInfo()
*gasUsed = C.size_t(cost.CPU)
info.SetString(string(ctxInfo))
return nil
}
//export goCall
func goCall(cSbx C.SandboxPtr, contract, api, args C.CStr, result *C.CStr, gasUsed *C.size_t) *C.char {
sbx, ok := GetSandbox(cSbx)
if !ok {
return C.CString(ErrGetSandbox.Error())
}
contractStr := contract.GoString()
apiStr := api.GoString()
argsStr := args.GoString()
callRs, cost, err := sbx.host.Call(contractStr, apiStr, argsStr)
*gasUsed = C.size_t(cost.CPU)
if err != nil {
return C.CString(err.Error())
}
rsStr, err := json.Marshal(callRs)
if err != nil {
return C.CString(host.ErrInvalidData.Error())
}
result.SetString(string(rsStr))
return nil
}
//export goCallWithAuth
func goCallWithAuth(cSbx C.SandboxPtr, contract, api, args C.CStr, result *C.CStr, gasUsed *C.size_t) *C.char {
sbx, ok := GetSandbox(cSbx)
if !ok {
return C.CString(ErrGetSandbox.Error())
}
contractStr := contract.GoString()
apiStr := api.GoString()
argsStr := args.GoString()
callRs, cost, err := sbx.host.CallWithAuth(contractStr, apiStr, argsStr)
*gasUsed = C.size_t(cost.CPU)
if err != nil {
return C.CString(err.Error())
}
rsStr, err := json.Marshal(callRs)
if err != nil {
return C.CString(host.ErrInvalidData.Error())
}
result.SetString(string(rsStr))
return nil
}
//export goRequireAuth
func goRequireAuth(cSbx C.SandboxPtr, ID, permission C.CStr, ok *C.bool, gasUsed *C.size_t) *C.char {
sbx, sbOk := GetSandbox(cSbx)
if !sbOk {
return C.CString(ErrGetSandbox.Error())
}
pubKeyStr := ID.GoString()
permissionStr := permission.GoString()
callOk, RequireAuthCost := sbx.host.RequireAuth(pubKeyStr, permissionStr)
*ok = C.bool(callOk)
*gasUsed = C.size_t(RequireAuthCost.CPU)
return nil
}
//export goReceipt
func goReceipt(cSbx C.SandboxPtr, content C.CStr, gasUsed *C.size_t) *C.char {
sbx, sbOk := GetSandbox(cSbx)
if !sbOk {
return C.CString(ErrGetSandbox.Error())
}
contentStr := content.GoString()
cost := sbx.host.Receipt(contentStr)
*gasUsed = C.size_t(cost.CPU)
return nil
}
//export goEvent
func goEvent(cSbx C.SandboxPtr, content C.CStr, gasUsed *C.size_t) *C.char {
sbx, sbOk := GetSandbox(cSbx)
if !sbOk {
return C.CString(ErrGetSandbox.Error())
}
contentStr := content.GoString()
cost := sbx.host.PostEvent(contentStr)
*gasUsed = C.size_t(cost.CPU)
return nil
}
//export goGetTokenName
func goGetTokenName(cSbx C.SandboxPtr, name *C.CStr, gasUsed *C.size_t) *C.char {
name.SetString(global.Token)
return nil
}
1
https://gitee.com/aiou-official/go-aiou.git
git@gitee.com:aiou-official/go-aiou.git
aiou-official
go-aiou
go-aiou
376a44096468

搜索帮助