【12】智能合约开发入门

发布于:2025-02-27 ⋅ 阅读:(11) ⋅ 点赞:(0)
  • 12-1 在线合约开发

Cloud IDE简介

基本框架

Cloud IDE是BaaS合约平台提供的在线合约开发工具

IDE是一个去中心化应用(Dapp),通过JavaScript SDK直接与区块链平台通信,进行合约部署和调用

核心功能

合约工程管理

合约编辑与编译

合约部署和调用

自动编解码

合约单步调试

合约分析

Cloud IDE入口一

BaaS平台的合约工程页面

Cloud IDE入口二

BaaS平台新手引导中的合约体验链卡片

合约工程管理

合约工程管理是左侧导航栏中第一个功能模块,提供如下功能:

  • 添加文件夹
  • 添加文件
  • 拖拽、移动文件或文件夹
  • 删除文件或文件夹

下载源代码

Cloud IDE提供“下载源代码”按钮

所有工程的源代码下载打包成contract.zip文件

本地编辑开发,备份

合约部署和调用

使用Cloud IDE开发合约的过程分为以下5步:

  1. 选择目标合约链
  2. 编译合约
  3. 部署合约
  4. 调用合约
  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一样,如果没有返回值,缺省是一个空数组
部署合约
  1. 单击“部署合约”将合约部署到目标链
  2. 如果合约定义了constructor方法,需要给定constructor方法的参数
  3. 部署成功后,可以看到合约的方法列表
调用合约

单击目标方法右侧的“调用合约”进行调用

状态变量的调用返回状态变量的值

合约方法返回如下字段:

参数 说明
Input 合约方法的输入数据,通常为合约方法的参数。
Output 合约方法的返回值,可能是多个值,根据返回值具体类型转码显示
log 如果在合约中使用了Event事件,并且事件被触发,则会在log中展示
日志调试合约

通过Event事件触发日志对合约内部逻辑进行调试

合约单步调试

合约调试模块可以通过一个内置的EVM虚拟机模拟器来模拟执行Solidity合约,并给出执行结果,以此达到调试合约的目的。

调试过程如下:

  1. 编译/部署
  2. 调用目标合约生成执行的交易hash
  3. 调试详情单击“调试”
  4. 单步调试

合约安全检测

合约安全检测平台通过Cloud IDE的插件方式集成到IDE功能中

  1. 创建任务
  2. 查看检测报告
    1. 合约统计信息
    2. 安全问题

开发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编译工具

本地开发步骤:

  1. 下载/安装solc-js
  2. 合约开发
  3. 合约编译
合约编译工具
下载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字节码,由合约平台区块链节点解释执行。

开发步骤:

  1. 准备环境
  2. 编写普通C++合约
  3. 编译合约
  4. 构建静态库
  5. 合约部署
  6. 合约调用
  7. 合约测试
准备环境

蚂蚁区块链平台提供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

  • my++ -c foo.cc bar.cc
  • llvm -ar rcs foobar.a foo.o bar.o

如果要使用该静态库,只需包含头文件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工程,里面自动生成一个测试用例