编写Golang合约
1.通过go.mod引用合约SDK
ChainMakerGolang合约SDK支持通过go.mod的方式引用,可直接使用go get引用,示例如下:
$go get chainmaker.org/chainmaker/contract-sdk-go/v2 v2.3.2
执行完成后,即可参考下文的编写合约注意事项,调用合约sdk的方法,编写合约。
2.编写合约注意事项
代码入口包名必须为main
代码入口
package main//sdk代码中,有且仅有一个main()方法func main(){//main()方法中,下面的代码为必须代码,不建议修改main()方法当中的代码//其中,TestContract为用户实现合约的具体名称err:=sandbox.Start(new(FactContract))if err!=nil{log.Fatal(err)}}
合约必要代码
//合约结构体,合约名称需要写入main()方法当中type FactContract struct{}//合约必须实现下面两个方法://InitContract()protogo.Response//UpgradeContract()protogo.Response//InvokeContract(method string)protogo.Response//用于合约的部署// return:合约返回结果,包括Success和Errorfunc(fFactContract)InitContract()protogo.Response{return sdk.Success([]byte("Init contract success"))}//用于合约的升级// return:合约返回结果,包括Success和Errorfunc(fFactContract)
UpgradeContract()protogo.Response{return sdk.Success([]byte("Upgrade contract success"))}//用于合约的调用// param method:交易请求调用的方法// return:合约返回结果,包括Success和Errorfunc(f*FactContract)InvokeContract(method string)protogo.Response{switch method{case"save":return f.save()case"findByFileHash":return f.findByFileHash()default:return sdk.Error("invalid method")}}
3.合约SDK接口描述
长安链提供golang合约与链交互的相关接口,写合约时可直接导入包,并进行引用,具体信息可参考文章末尾”接口描述章节”。
4.编译合约
当合约编写完成后,则需要编译合约,具体教程如下
5.使用脚本编译合约
在合约工程中添加编译脚本build.sh搭建编译环境。
#!/bin/bashcontractName=$1if[[!-n$contractName]];then echo"contractName is empty.use as:./build.sh contractName"exit 1figo build-ldflags="-s-w"-o$contractName7z a$contractName$contractNamerm-f$contractName
编译撰写好的智能合约
其中ContractName请替换成需要安装的合约名称
./build.sh ContractName
编译成功,如下图所示:
6.手动编译合约
需要保证是在Linux环境下编译,在此文件夹的当前路径执行如下编译命令:
#如果需要在其他系统环境下编译合约,请参考Golang的交叉编译修改go build命令。go build-ldflags="-s-w"-o file_name 7z a file_name file_name
在编译合约时,首先使用golang编译程序。
编译后使用7zip对编译好的可执行文件进行压缩。
编译结果输出与使用脚本编译一致。
7.部署调用合约
编译完成后,将得到一个.7z格式的合约文件,可将之部署到指定到长安链上,完成合约部署。部署合约的使用教程可详见:部署示例合约。