前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >智能合约DAPP开发,DAPP智能合约系统开发实现技术原理及代码部署

智能合约DAPP开发,DAPP智能合约系统开发实现技术原理及代码部署

原创
作者头像
VX_I357O98O7I8
发布2022-11-24 16:23:28
3990
发布2022-11-24 16:23:28
举报
文章被收录于专栏:商业模式策划

2. 使用Golang进行智能合约开发

读者对象:本章节主要描述使用Golang进行ChainMaker合约编写的方法,主要面向于使用Golang进行ChainMaker的合约开发的开发者。

2.1. 环境依赖

  1. 操作系统 目前仅支持在Linux系统下部署和运行 Docker VM,合约的编译也必须在Linux环境下执行。如果需要在其他系统环境下编译合约,请参考Golang的交叉编译修改编译命令。
  2. 软件依赖 推荐使用Goland 或 vscode等IDE编写和编译Golang合约。 编译后的合约需要经过7zip压缩形成最终的合约文件,7zip的安装请参看7zip官网
  3. 长安链环境准备 准备一条支持Docker_VM的长安链,以及长安链CMC工具,用于将写编写好的合约,部署到链上进行测试。相关安装教程请详见:

2.2. 编写Golang合约

2.2.1. 通过go.mod引用合约SDK

ChainMaker官方Golang合约SDK支持通过go.mod的方式引用,可直接使用go get引用,示例如下:

代码语言:javascript
复制
$ go get chainmaker.org/chainmaker/contract-sdk-go/v2@v2.3.2

执行完成后,即可参考下文的编写合约注意事项,调用合约sdk的方法,编写合约。

2.2.2. 编写合约注意事项

  1. 代码入口包名必须为main
  2. 代码入口 package main // sdk代码中,有且仅有一个main()方法 func main() { // main()方法中,下面的代码为必须代码,不建议修改main()方法当中的代码 // 其中,TestContract为用户实现合约的具体名称 err := sandbox.Start(new(FactContract)) if err != nil { log.Fatal(err) } }
  3. 合约必要代码 // 合约结构体,合约名称需要写入main()方法当中 type FactContract struct { } // 合约必须实现下面两个方法: // InitContract() protogo.Response // UpgradeContract() protogo.Response // InvokeContract(method string) protogo.Response // 用于合约的部署 // @return: 合约返回结果,包括Success和Error func (f *FactContract) InitContract() protogo.Response { return sdk.Success([]byte("Init contract success")) } // 用于合约的升级 // @return: 合约返回结果,包括Success和Error func (f *FactContract) UpgradeContract() protogo.Response { return sdk.Success([]byte("Upgrade contract success")) } // 用于合约的调用 // @param method: 交易请求调用的方法 // @return: 合约返回结果,包括Success和Error func (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") } }

2.2.3. 合约SDK接口描述

长安链提供golang合约与链交互的相关接口,写合约时可直接导入包,并进行引用,具体信息可参考文章末尾”接口描述章节”。

2.2.4. 编译合约

当合约编写完成后,则需要编译合约,具体教程如下

2.2.4.1. 使用脚本编译合约
  1. 在合约工程中添加编译脚本build.sh搭建编译环境。 #!/bin/bash contractName=$1 if [[ ! -n $contractName ]] ;then echo "contractName is empty. use as: ./build.sh contractName" exit 1 fi go build -ldflags="-s -w" -o $contractName 7z a $contractName $contractName rm -f $contractName

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 使用Golang进行智能合约开发
    • 2.1. 环境依赖
      • 2.2. 编写Golang合约
        • 2.2.1. 通过go.mod引用合约SDK
        • 2.2.2. 编写合约注意事项
        • 2.2.3. 合约SDK接口描述
        • 2.2.4. 编译合约
    相关产品与服务
    容器镜像服务
    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档