进入Cloud IDE开发环境
可通过以下任一方式进入 Cloud IDE 合约开发环境:
在BaaS 平台BaaS 平台,单击蚂蚁区块链 > 合约链,单击目标链操作栏下的管理,单击左侧导航栏上的合约工程管理。在合约工程管理页,您可以通过创建合约工程或编辑已有的合约,进入 Cloud IDE 合约开发环境。
您也可以单击蚂蚁区块链 > 概览页面的合约体验链卡片上的调试合约,进入Cloud IDE开发环境。
Cloud IDE 合约工程管理
可以通过Cloud IDE对合约工程内的文件夹、文件进行 新建、删除、修改名字 操作。
序号 | 图标 | 功能 |
① | 添加文件、文件夹 | |
② | 删除文件、文件夹 | |
③ | 修改文件、文件夹 |
从合约工程管理页面进入Cloud IDE, 默认实时保存文件。
当前Cloud IDE仅支持对Solidity合约进行编译,新增合约文件请以
.sol
结尾,否则编译失败。
Cloud IDE 合约开发流程
使用 Cloud IDE 开发合约的过程主要分为以下 5 步:
选择目标合约链
在 Cloud IDE 中,点击 环境配置,选择目标的合约链环境。
在 环境配置 中,您可以选择自己已有的链配置环境。例如,您已申请体验链,则可以选择已有的公共 合约链,该体验链会配备一个默认的测试账户,可以用来部署、调用合约。如果此测试账户不能满足需求,您也可以使用通过 SDK 创建的账户,但是需要填入私钥(16 进制字符串),因为在部署、调用合约时 IDE 都需要账户的私钥对交易做签名处理。关于如何获取 16 进制字符串形式的私钥,参见 JS SDK 快速开始中的示例代码。
编译合约
开发合约过程中,可以随时对已完成的代码进行编译。
在 Cloud IDE 中,点击 编译,开始编译代码。
字节码即合约代码的编译结果,也是合约部署时使用的关键数据,通过 SDK 可以将合约字节码部署到目标的生产链上使用。
合约接口说明(ABI)应用程序二进制接口(Application Binary Interface,ABI)可以理解为合约的接口说明。当合约被编译后,其对应的 ABI 也会一起生成。
ABI 类似于程序中的接口说明文档,描述了属性和方法签名相关信息,包括字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等。
ABI 参数说明:
参数 | 说明 |
name | 函数名称 |
type | 方法类型,包括 function、constructor、fallback(缺省方法),默认为 function。 |
constant | 布尔值,如果为 true,则表示方法不会修改合约字段的状态变量。 |
payable | 布尔值,表示方法是否可以接收系统转账。 |
stateMutability | 状态类型,包括 pure(不读取区块链状态)、view(和 constant 类型一样,只能查看,不会修改合约字段)、nonpayable(和 payable 含义一样)、payable(和 payable 含义一样)。 |
inputs | 数组,描述参数的名称和类型。 |
name | 参数名称 |
type | 参数类型 |
outputs | 和 inputs 一样,如果没有返回值,缺省是一个空数组。 |
更多 ABI 相关信息,参见 Solidity ABI 官方介绍(英文)。
部署合约
在合约编译通过,得到字节码和 ABI 后,在 Cloud IDE 中点击 部署合约 将合约部署到目标体验链进行测试。
在部署定义了 constructor
方法的合约时,需要给定 constructor
方法的参数。Cloud IDE 支持合约方法参数类型的提示和一些基本数据类型的初始化赋值,您可根据自身实际情况初始化合约。
部署成功后,可以看到合约的所有方法列表。
调用合约
合约部署成功后,IDE 会列出合约中所有的 public 方法以及 public 类型的状态变量。点击目标方法右侧的 调用合约 进行调用。
其中,状态变量对应的调用可以直接返回当前状态变量的值。合约方法的调用可以返回如下几个字段:
参数 | 说明 |
input | 合约方法的输入数据,通常为合约方法的参数。 |
output | 合约方法的返回值,可能是多个值,根据返回值具体类型转码显示。 |
log | 如果在合约中使用了 Event 事件,并且事件被触发,则会在 log 中展示。 |
错误说明
在使用 Cloud IDE 过程中,可能遇到一些错误提示。在调用合约时,如果合约执行过程中出错,可能有多种原因,Cloud IDE 会将合约调用失败的错误码信息返回,便于您分析原因。Cloud IDE 使用的错误码信息与 SDK 使用的错误码保持一致,您可以查看 合约链错误码找到对应的错误码说明。
下面通过一个错误码示例来说明如何通过错误说明的提示分析合约内部错误的原因,您也可以通过添加 Event 事件的方式来调试合约。
错误码示例:
在上图的错误码示例中,系统调用了 Cloud IDE 示例合约的 voteForCandidate
方法,给定的候选人为Demi
,返回的错误码为10201
,其含义为:
错误码 | 错误码值 | 描述 |
VM_REVERT | 10201 | 触发 revert 指令导致的错误 |
根据错误码提示,可以判断调用合约失败是因为触发了 revert
语句,含义为某个 require()
方法判断失败。查看合约代码,即可发现 voteForCandidate
方法中的相关条件检查:
require(validCandidate(candidate));
由此,可推断出输入的候选人 Demi
不合法,并不在实际投票的候选人列表 candidateList
中。事实也确实如此,合约部署过程中,constructor
参数仅指定了 Nick
和 Rose
两个候选人参与竞选。
调试合约
目前,您可以通过添加 Event
事件触发日志的方式实现逻辑分支的判断和分析,进而对合约内部逻辑进行调试。
这里选择调用合约方法 validCandidate
。
// This function will help to check whether target candidate is in the candidateList.
function validCandidate(bytes32 candidate) view public returns (bool) {
for (uint i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
emit VALID(true);
return true;
}
}
emit VALID(false);
return false;
}
在 validCandidate
方法的实现中,不同的执行逻辑会根据情况触发不同的 Event
事件,通过查看调用结果日志信息,即可分析出合约的执行路径。在以上示例中,执行逻辑相对简单。在复杂的逻辑控制方法中,通过添加 Event
事件的方式可以很好的追踪合约执行路径,达到调试合约的目的。