玩转智能合约_v0.0.1_持续更新。。。

标题 版本号 作者 qq 技术栈版本号 IDE 官网
玩转智能合约_v0.0.1_持续更新。。。 v0.0.1 若布与宫合 8416837 protobuf3.10.1
golang1.13.4
LiteIDE protobuf
golang

部署智能合约

c++版

  • 在区块链教程已经详述过C++版的智能合约的编译、部署,大致步骤是将代码build成*.wasm文件,随后跑命令部署即可,之后就可以调用这个合约,当然还有权限、消费问题,它们不是本话题的重点,略过不表,请见我的区块链教程。

golang版

  • 这次演示一下golang版的合约部署。这里触及到WebAssembly知识,请详阅:了解WebAssembly
GOOS=js GOARCH=wasm go build -o XXX.wasm XXX.go # 编译合约,-o:输出的文件,末尾的XXX.go指源码

不出意外的,报错了:
win

go: github.com/Azure/go-ansiterm@v0.0.0-20170929234023-d6e3b3328b78: Get https://proxy.golang.org/github.com/%21azure/go-ansiterm/@v/v0.0.0-20170929234023-d6e3b3328b78.mod: dial tcp 216.58.221.177:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

解决办法:
增加代理

# linux
export GOPROXY=https://mirrors.aliyun.com/goproxy/
# win,增加环境变量
GOPROXY === https://mirrors.aliyun.com/goproxy/ # 实测有效
  • 编译*.go
cd /home/app/newChain/source/XuperUnion/contractsdk/go/example/math # cd 智能合约源码目录
GOOS=js GOARCH=wasm -o math.wasm math.go

编译成功:
在这里插入图片描述

./xchain-cli account query # 检查合约账户存不存在
./xchain-cli wasm deploy --account XC1234560123456789@xuper --cname math001  -H 127.0.0.1:37101 wasm/math.wasm -a '{"creator":"MrChengYe"}' # 部署命令。可能需要较长等待。。。

实例学习

下载XuperUnion源码学习

准备工作
git clone https://gitee.com/mirrors/XuperUnion

使用LiteIDE打开项目

找到xuperunion/contractsdk/go/example/math/math.go
按快捷键Ctrl + b,编译,报错了:

# github.com/Microsoft/go-winio
..\..\..\..\..\..\..\pkg\mod\github.com\!microsoft\go-winio@v0.4.14\privilege.go:129:7: assignment mismatch: 2 variables but "golang.org/x/sys/windows".GetCurrentProcess returns 1 values
错误: 进程退出代码 2.

错误是说,有个函数应该返回2个值,但是只返回了1个。下面是这行代码:

p, _ := windows.GetCurrentProcess() // 要求2个返回值

这个问题,我们有了一定基础后再解决。

代码理解

函数结构:
在这里插入图片描述
Query函数

func (m *math) Query(nci code.Context) code.Response {
	key, ok := nci.Args()["key"]
	if !ok {
		return code.Errors("argument keys not found")
	}
	value, _ := nci.GetObject(key)
	return code.OK(value)
}

大概意思是:实现context接口的对象作为入参,接收账户传入的参数,再提供给golang的函数。GetObject就是一个接口函数,它可以返回key对应的value。至于在哪里实现context接口的,可以看源码求证,这个和SDK有关,请见下文。

SDK学习
  • 简介
    XuperUnion为方便用户开发属于自己的智能合约,提供了一整套SDK套件,即XuperCDT(XuperChain Crontract Development Toolkit),包含C++语言和Go语言。
  • GetObject
func GetObject(key []byte) ([]byte, error) // 反正你getkey就能返回value或者报错key不存在
  • NewIterator
func NewIterator(start, limit []byte) Iterator

Demo

Key() []byte
Value() []byte
Next() bool
Error() error
// Iterator 必须在使用完毕后关闭
Close()
原创文章 59 获赞 8 访问量 4万+

猜你喜欢

转载自blog.csdn.net/cc007cc009/article/details/103223577