12-1 在线合约开发
Cloud IDE简介
基本框架
Cloud IDE是BaaS合约平台提供的在线合约开发工具
IDE是一个去中心化应用(Dapp),通过JavaScript SDK直接与区块链平台通信,进行合约部署和调用

核心功能
合约工程管理
合约编辑与编译
合约部署和调用
自动编解码
合约单步调试
合约分析
Cloud IDE入口一
BaaS平台的合约工程页面

Cloud IDE入口二
BaaS平台新手引导中的合约体验链卡片

合约工程管理
合约工程管理是左侧导航栏中第一个功能模块,提供如下功能:
- 添加文件夹
- 添加文件
- 拖拽、移动文件或文件夹
- 删除文件或文件夹

下载源代码
Cloud IDE提供"下载源代码"按钮
所有工程的源代码下载打包成contract.zip文件
本地编辑开发,备份

合约部署和调用
使用Cloud IDE开发合约的过程分为以下5步:
- 选择目标合约链
- 编译合约
- 部署合约
- 调用合约
- 调试合约
选择目标合约链
- 选择"合约体验链",该体验链配置默认测试账户。也可以使用通过SDK创建的账户,需要填入账户名和私钥(解密后的16进制字符串,长度32 byte)

- 选择"自定义",需要配置目标链环境的一个节点(host和端口),目前Cloud IDE仅支持通过http协议和链通信,同时填写一个部署、调用合约的账户信息,此账户必须已在目标合约链上创建完成。

编译合约
- 字节码
- 合约代码的编译结果,通过SDK可以将字节码部署到目标生产链
- 合约接口说明(ABI)
- 应用程序二进制接口(Application Binary Interface,ABI)可以理解为合约的接口说明
| 参数 | 说明 |
| name | 函数名称 |
| type | 方法类型,包括function、constructor、fallback(缺省方法),默认为function |
| constant | 布尔值,如果为true,则表示方法不会修改合约字段的状态变量 |
| payable | 布尔值,表示方法是否可以接收系统转账 |
| stateMutability | 状态类型,包括pure(不读取区块链状态)、view(和constant类型一样,只能查看,不会修改合约字段)、nonpayable(和payable含义一样)、payable(和payable含义一样) |
| inputs | 数组,描述参数的名称和类型。 |
| name | 参数名称 |
| type | 参数类型 |
outputs | 和inputs一样,如果没有返回值,缺省是一个空数组 |
---|
部署合约
- 单击"部署合约"将合约部署到目标链
- 如果合约定义了constructor方法,需要给定constructor方法的参数
- 部署成功后,可以看到合约的方法列表
调用合约
单击目标方法右侧的"调用合约"进行调用
状态变量的调用返回状态变量的值
合约方法返回如下字段:
| 参数 | 说明 |
| Input | 合约方法的输入数据,通常为合约方法的参数。 |
| Output | 合约方法的返回值,可能是多个值,根据返回值具体类型转码显示 |
log | 如果在合约中使用了Event事件,并且事件被触发,则会在log中展示 |
---|
日志调试合约
通过Event事件触发日志对合约内部逻辑进行调试

合约单步调试
合约调试模块可以通过一个内置的EVM虚拟机模拟器来模拟执行Solidity合约,并给出执行结果,以此达到调试合约的目的。
调试过程如下:
- 编译/部署
- 调用目标合约生成执行的交易hash
- 调试详情单击"调试"
- 单步调试
合约安全检测
合约安全检测平台通过Cloud IDE的插件方式集成到IDE功能中
- 创建任务
- 查看检测报告
- 合约统计信息
- 安全问题
开发C++合约
蚂蚁区块链平台在支持Solidity的同时,也支持C++合约语言
不同合约语言运行的虚拟机环境不同
Cloud IDE环境下solidity和C++的功能对比:

开发TEE硬件隐私合约链
目标合约链选择TEE硬件隐私合约链
目前TEE硬件隐私合约链的加密交易仅支持solidity合约语言

对于TEE硬件隐私合约链,Cloud IDE会显示TEE加密配置
通过"TEE加密配置"可选择是否"启用TEE加密"
选择自定义AES密钥,或单击"生成密钥"随机生成密钥

如果一个合约是在"启用TEE加密"情况下部署,只有AES密钥才能成功调用此合约
进而只有AES密钥才能解密调用合约的结果

12-2 本地开发
12-2-1 本地开发环境搭建
申请区块链证书
连接到区块链平台,需要以下三个相关文件和一个密码
按照本节操作说明生成证书文件,引导过程中记录相关密码,并下载自动生成的文件。
| 文件 | 说明 | 来源 |
| ca.crt | 合约链的认证CA | BaaS平台下载 |
| client.key | RSA密钥 | 通过BaaS申请证书引导在线生成 |
| client.crt | RSA证书,与client.key是一对 | 通过BaaS申请证书引导在线生成 |
密码 | client.key文件的解密密码 | 证书生成过程中输入 |
---|
可以为联盟内的链或合约体验链申请证书,本节以合约体验链为例讲解操作步骤。
首先登录BaaS平台控制台,如果目标是联盟链,选择目标联盟,左侧导航栏点击联盟内的链,右侧选择区块链
如果是合约体验链,进入区块链实验室,单击合约体验链上的 开发组件及证书 > 创建证书 按钮

生成证书和密钥。BaaS平台提供"自动生成密钥和证书(密钥非托管)"和"手动生成密钥和证书"两种方式。推荐使用安全、便捷的自动生成方式。

若选择 自动生成密钥和证书(密钥非托管),需完成以下步骤:

若选择 手动生成密钥和证书,需要上传证书请求文件(如何生成"证书请求文件"见第3节)

证书创建之后,进入区块链实验室界面可以下载证书和签名证书
不再有下载私钥client.key选项

创建账户
在合约链上提交交易,需要使用一个已经在链上存在的账户。账户可以通过BaaS平台申请创建
单击合约体验链上的 更多 > 创建账户 按钮

BaaS平台提供 自动生成密钥和证书 和手动生成密钥和证书 两种方式创建账户。推荐使用安全、便捷的自动生成方式。

若选择 自动生成密钥和证书(密钥非托管),需完成以下步骤:

若选择 手动生成密钥和证书,需要填写账户名称、公钥及恢复公钥(如何生成公钥见第3节)
单击 创建账户

账户私钥文件的三种使用场景:
| | 区块链开发工具 | |
| 场景一 | ChainStack Myfish | 直接使用user.key |
| 场景二 | JS SDK | user.pem |
场景三 | Cloud IDE 设置目标链,使用创建的账户和私钥 | 解密之后的HEX字符串,长度32字节 |
---|
账户私钥文件user.key转换成user.pem需要执行以下openssl命令

账户私钥文件user.key为加密格式,不能用于Cloud IDE切换账户时的私钥,需要转换成32字节的解密私钥。解密方法可以使用openssl命令,或者采用蚂蚁区块链提供的JS SDK去解析user.pem

本地生成证书请求和公私钥对
"证书请求文件"生成方法一:使用OpenSSL
- 前往OpenSSL下载页面,找到1.0.2o版本并下载安装包
- 使用OpenSSL制作私钥和证书请求文件
- openssl req -newkey rsa:2048 -keyout client.key -out client.csr
在该命令执行过程中,系统会要求您填写如下信息:
- Country Name(2 letter code):使用国际标准组织(ISO)国码格式,填写2个字母的国家代号,如中国填写CN。
- State or Province Name(full name):省份,例如填写Zhejiang。
- Locality Name(eg,city):城市,例如填写Hangzhou。
- Organization Name(eg,company):组织单位,例如填写公司名的拼音。
- Organizational UnitName(eg,section):部门名称,例如填写IT Dept。
- Common Name(eg,your websites domain name):进行SSL加密的网站域名。
- Email Address:邮箱地址,选填。
- A Challenge password:选填。
- An optional company name:选填。
"证书请求文件"生成方法二:使用本地密钥服务
- 准备Java运行环境,1.7版本以上
- 下载密钥生成工具,https://baas-public.oss-cn-shanghai.aliyuncs.com/baas-crypto-tool-1.0.0.jar
- 运行命令启动密钥服务
- java -jar baas-crypto-tool-1.0.0.jar --server.port=8080
- 在浏览器中访问 http://localhost:8080/api/crypto/generateTlsKey?algo=rsa\&isPkcs8=true\&password=${password},生成tlskey.zip文件包
- 解压该zip包后得到client.key和client.csr(证书请求文件)
账户公钥、恢复公钥生成方法:使用本地密钥服务
- 同"证书请求文件"生成方法二,运行本地密钥服务
- 在浏览器中访问http://localhost:8080/api/crypto/generateUserKey?algo=ec\&isPkcs8=true\&password=${password},生成userkey.zip文件包
- 解压该.zip包后得到user.key和pub.txt。其中,user.key为账户私钥,pub.txt为账户公钥。
- 使用不同密码在浏览器中再次访问上述URL
- 解压新zip包后得到user.key和pub.txt。其中,user.key为账户恢复私钥,pub.txt为账户恢复公钥。
查看区块链节点信息
为了与合约链交互,需要获取节点的IP地址和端口号。
在BaaS平台,通过查看目标合约链详情,在区块浏览器中查看节点详情可获取链节点的IP地址和端口号。

12-2-2 本地开发
Solidity合约开发
蚂蚁链合约平台支持Solidity语言来实现合约的编写和编译
蚂蚁链提供在线工具Cloud IDE和本地solc-js编译工具
本地开发步骤:
- 下载/安装solc-js
- 合约开发
- 合约编译
合约编译工具
下载solc-js
从蚂蚁链网站获取合约编译工具solc-js安装包:alipay-solc-0.1.12.tgz
蚂蚁链对Solidity语言的支持和原生的Solidity不同,不能使用外部社区的solc-js编译工具
安装solc-js
下载并安装Node.js(推荐版本:v10.11.0)
全局安装solc-js。执行命令 npm i -g alipay-solc-0.1.12.tgz
使用solc-js
命令行语法:Usage:solcjs[options]<FILENAME>
| 命令选项 | 说明 | 类型 |
| --version | 显示版本号 | 布尔 |
| --optimize | 启用字节码优化器 | 布尔 |
| --bin | 十六进制合约的二进制 | 布尔 |
| --abi | 合约接口说明 | 布尔 |
| --standard-json | 打开标准JSON输入或输出模式 | 布尔 |
| --output-dir, -o | 合约输出的目录 | 字符串 |
--help | 显示帮助信息 | 布尔 |
---|
编译示例
- 创建名为hello.sol的solidity合约示例

- 运行以下命令行,编译hello.sol合约并得到编译字节码结果
- solcjs --bin hello.sol

- 运行以下命令行,编译hello.sol合约并得到合约接口说明(ABI)
- solcjs -- abi hello.sol

JS代码中编译合约
- 创建目录solcjs-test,执行npm init,将alipay-solc-0.1.12.tgz文件放到solc-test目录
- 运行以下命令行,在solc-test目录中安装solc-js
- npm i alipay-solc-0.1.12.tgz -save
- 代码中编译合约,创建index.js文件。内容如下:

示例

合约部署、升级、调用
在JS代码中编译Solidity合约后,得到编译字节码和合约接口说明(ABI),进而可直接使用JS SDK来部署、调用合约
solc-js工具在JS代码中默认也使用 --bin 参数编译合约得到字节码,此字节码不能直接用于合约升级,但是通过一次"本地合约部署"之后即可得到 runtime 字节码,用于合约升级使用
二进制solc编译工具同时支持 --bin -runtime 和 --bin 参数,这两个参数在编译结果上的主要差异在于,--bin参数编译字节码除了包含--bin-runtime参数的编译字节码结果之外,还包含合约初始化方法constructor的相关字节码等内容
C++合约开发
蚂蚁区块链智能合约平台提供一套基于C99/C++14标准的C++语言子集作为合约语言。
通过编译工具(mychain.mycdt)将合约代码编译成wasm字节码,由合约平台区块链节点解释执行。
开发步骤:
- 准备环境
- 编写普通C++合约
- 编译合约
- 构建静态库
- 合约部署
- 合约调用
- 合约测试
准备环境
蚂蚁区块链平台提供C++编译工具mychain.mycdt
- mychain.mycdt将合约代码编译成wasm代码
- Linux平台,下载安装包MYCDT-2.24.2-Linux-x86_64.tar.gz
- 执行tar命令解压
- 修改PATH环境变量
- 执行my++ -version命令,验证是否安装成功
普通wasm合约
编辑hello.cpp,引入需要的头文件<mychainlib/contract.h>
编写简单测试合约

my++
执行命令 my++ -o hello.wasm hello.cpp
如果编译成功,可以得到以下三个文件
- hello.wasm:合约的wasm字节码文件
- hello.abi:合约的abi定义文件
- hello.wasc:合并字节码和ABI的文件

构建静态库
静态库会链接进目标文件
使用MYCDT提供的工具,将一组源文件编译打包成一个wasm静态库,供合约使用
如果编写两个C++源文件foo.cc和bar.cc,分别定义一些工具函数,函数接口统一声明在头文件foobar.h
用以下命令编译,打包成静态库foobar.a
如果要使用该静态库,只需包含头文件foobar.h,然后编译时指定静态库即可
- my++ main.cc foobar.a -o contract.wasm
12-3 ChainStack框架开发
ChainStack简介
基于蚂蚁链的区块链应用技术图谱,ChainStack从框架与服务角度出发,打造服务于区块链应用的框架
特点
- 一套智能合约框架
- 一套可复用的应用组件
- 一套完整的DApp应用工具链
ChainStack环境申请
开发者体验链可以通过BaaS Rest交易网关进行访问
访问BaaS Rest有相应的权限验证机制
访问之前,需要在开发者实验室完成以下申请
- Access Key
- Access Secret
- 链上账户
步骤一
登录开发者实验室,进入 开发者实验室 -> 应用开发工具 页面

通过立即申请或重置可以获得Access-id和Access.key

步骤二
创建发送链上交易所需的区块链账户

填写账户名称、私钥密码和恢复私钥密码
创建完成后下载账户的公私钥对以及恢复公私钥对
可以通过再次点击"立刻申请"创建新的账户

安装依赖软件
JDK版本 >= 1.8,(下载地址:https://openjdk.java.net/install/)
Maven版本 >= 3.2.5 (下载地址:https://maven.apache.org/download.cgi)

安装cstack工具
cstack是智能合约研发命令行工具,通过该工具可以完成cstack工程的创建、编译、测试、三方包管理、标准组件导出等功能。
- 下载ChainStack安装包,解压安装包
- 进入安装包目录,执行bash install_nix.sh && source ~/.chainstack/env
- 执行成功后检查安装

一键创建简单wasm合约工程
执行命令 cstack quickinit Demo 创建名为Demo的合约项目

网络环境配置
打开project-setting.yaml,填入"环境申请"得到的账户信息和BaaS Rest访问信息

一键运行合约
运行测试用例
执行命令 cstack test 运行测试用例
编译合约
执行命令 cstack build,合约模块会编译出智能合约字节码
字节码需要部署到区块链上,通过交易触发才能执行

DApp工程结构
cstack quickinit 会生成一个DApp工程,包含两个模块
- 合约模块:contract目录为合约模块,含有一个智能合约
- Java集成测试模块:test/ittest目录为Java测试模块,这是一个标准Maven工程,里面自动生成一个测试用例
