1、产品背景及意义
在长安链的社区运营中我们发现,新用户在部署长安链时,由于本地的环境各异,对快速体验测试长安链造成一些不必要的阻塞。因而我们规划在云服务器上,提供一套适配长安链的标准环境,供社区开发者对长安链进行体验及测试。
此外腾讯云Lighthouse具备低成本的特性,当社区用户有轻量级的长安链应用需要做试点和demo时,也可在利用Lighthouse低成本地实现。
本产品主要包含:一台腾讯云CVM服务器、一套长安链管理平台,一条长安链,一个CMS交互式控制台。
为方便用户使用,已将长安链内置订阅到长安链管理台内,并提供四个常用的测试合约,供新用户快速上手体验。
2、购买Lighthouse 长安链服务
我们首先在腾讯云Lighthouse轻量应用服务器购买页面,购买一台服务器。如下图所示。
服务器具体配置如下
- 地域:按需选取即可
- 镜像类型:应用镜像
- 应用名称:长安链Chainmaker
- 实例套餐,即服务器配置,最低服务器机器配置要求2核8G。
- 购买时长:按需购买即可
长安链产品本身免费,此处用户支付的为腾讯云服务器的费用。
点击立即购买,按步骤付款之后,即可自己在购买的腾讯云服务器上拥有了一套长安链环境。
3、访问长安链管理台
进入Lighthouse(轻量应用服务器)控制台,在服务器模块找到自己购买的长安链服务,点击进入服务详情。
在应用管理里,找到长安链管理台应用,其中
- 登录地址为该管理台的访问地址
- 默认到账户名为admin,默认密码可点击登录按钮,登录到服务器内并输入如下指令获取密码。
cat /home/chainmaker/credentials.txt
- 更多使用说明可查看,用户使用手册
- 长安链节点地址为,节点的RPC地址,可通过在SDK上配置该地址直接访问链。
4、管理台使用说明
4.1、登录模块
- 使用上文获取到的账户和密码登录管理台。
4.2、内置长安链配置说明
- 目前管理台里已内置了一条长安链,主要配置信息如下
序号 | 内容 | 说明 |
---|---|---|
1 | 长安链版本 | V2.2.1 |
2 | 链id | chain1 |
3 | 组织数 | 4个组织 |
4 | 节点数 | 4个共识节点 |
5 | 共识算法 | TBFT |
6 | 单区块最大交易容量 | 100笔交易 |
7 | 交易过期时长 | 600s |
8 | 交易间隔 | 2000ms |
9 | 是否支持docker_VM | 支持 |
4.3、区块链列表
- 在区块链管理处,可看到已经内置部署的长安链。点击卡片开始使用。
- 该链所用的的相关证书,可在证书模块里查看并下载。
- 默认用该链的,org1组织下的consensus1节点来订阅链,以及通过org1组织下的admin1用户证书来给链发交易。
4.4、查看示例合约
- 此处展示本区块链已经部署的合约信息。支持新增合约,升级合约,冻结合约,解冻合约,注销合约,编辑查看合约等。
- 默认会内置四个测试合约,包含存证合约,转账合约,ERC-20合约,ERC-721合约。相关合约介绍,可查看合约介绍章节。
4.5、使用示例合约
- 此处展示通过该平台调用合约的记录,以及执行结果,也可点击查看详情,跳转到区块链浏览器查看详细的链上信息。
- 在此处可点击发起上链直接调用示例合约。
- 使用前,建议请您先前往合约介绍章节,熟悉示例合约的具体业务内容,再进行调用。
4.6、发起上链
- 此处可选择你要调用的合约,以及对应的合约方法,并填写入参,点击确定,发起上链交易。
- 发起上链请求后,将会用订阅链时所选择的用户来构建交易,并进行交易签名。
- 交易发送成功后,可到区块链浏览器里查看详情
4.7、查看交易详情
- 每次上链的信息都会以区块链交易的形式,发送到区块链上。
- 此处可查看交易详情,包括交易的所属区块信息,交易发起人信息,交易所调用的合约,交易所携带上链的信息等。
4.8、查看区块详情
- 一段时间内的交易会被集中打包到区块内,并以新区块链的形式和其他区块进行链接从而形成一段不断增长的区块链。
- 此处可查看区块的具体信息,包括区块哈希,读写集哈希,DAG信息,以及本区块内的交易信息。
5、示例合约介绍
5.1、整体说明
为方便用户查看,对下面要讲到的合约内容进行一个整体的描述(或规范)。
- 函数类型:包括执行和查询两类,其中执行函数会进行链共识操作,查询函数则不会,仅调用连接节点的处理逻辑;
- 返回值:成功时有具体的返回值描述,失败时则会返回失败原因(函数集表格中不再说明失败情况);
- 入参说明:若该参数为可选会进行说明,其他情况均为必选。
5.2、合约列表
目前预先部署了4个示例合约,如下表所示:
序号 | 合约名称 | 合约功能 |
---|---|---|
1 | SaveContract | 存证合约,可保存Key-Value及描述信息 |
2 | TransferContract | 普通转账合约,用于普通的转账业务,无权限等相关设计 |
3 | ERC20Contract | ERC20合约,基本符合以太坊官方标准,可作为Token发布的Demo |
4 | ERC721Contract | ERC721合约,基本符合以太坊官方标准,可作为NFT发布的Demo |
5.3、存证合约(Save)
5.3.1、合约函数集
函数名 | 函数类型 | 函数说明 | 入参说明 | 返回值 | 备注 |
---|---|---|---|---|---|
save | 执行 | 存证 | key:数据存储的key data:数据存储的内容 desc:数据存储的描述(可选) | 数据存储的key | 重复的key会将原数据覆盖 |
find | 查询 | 查询对象 | key:数据存储的key | 存储内容的JSON格式 | 对象结构体:
type EvidenceInstance struct {
Key string |
进行save操作,即保存对象至底链时,若保存成功会触发 保存 事件,该事件主题为:topic_save
5.3.2 合约使用指南
存证合约的使用非常简单,主要包括两个方法:
- 1)存证数据:调用save函数对数据进行存储;
- 2)查询数据:调用find函数查询已经存储的内容;
5.4、普通转账合约
5.4.1 合约函数集
函数名 | 函数类型 | 函数说明 | 入参说明 | 返回值 | 备注 |
---|---|---|---|---|---|
reset | 执行 | 设置账号资产 | account:账号; assets:资金数量,uint64格式的字符串 | 该账号的资产; | 账号可以是任意的字符串 |
add | 执行 | 为特定账号增加指定数量资产 | account:特定的账号; assets:该账号增加的资金数量,uint64格式的字符串 | 该账号的剩余所有资产; | |
transfer | 执行 | 资产转移 | from:转出的账号 to:转入的账号 assets:转移资产数量,uint64格式字符串 | 转出账号的剩余资产数量 | |
find | 查询 | 查询账号的资产数量 | account:特定的账号 | 该账号的剩余资产 |
该合约中的所有函数的入参都为必选项,不可以为空,且有严格的格式校验,账号不推荐使用"/&%#@“等特殊符号 当调用reset、add、transfer操作时,若操作成功会触发转移 事件,该事件主题为:topic_transfer
5.4.2 合约使用指南
该合约调用核心流程较为简单,可简单分为如下三个步骤:
- 1)配置资产:调用reset函数,可给某个账号设置一定数量的资产;
- 2)转移资产:调用transfer函数,可将某个账号的指定数量资产转移至另外的账号中;
- 3)增发资产:调用add函数,可给某个账号增加指定数量的资产;
如果想查询某个账号的资产,可以调用find函数,传入账号的地址即可。
5.5、ERC20合约
5.5.1 合约初始化
合约在初始化的过程中可以设置一些基础配置,包括发行token的名称、简称、总量等信息,若不设置则会使用合约代码中默认的配置。初始化过程中涉及到的参数配置列表说明如下:
参数名 | 参数含义 | 默认值 |
---|---|---|
owner | 合约拥有者地址 | 发起合约安装的用户地址 |
totalSupply | token总供应量 | 1_000_000_000,10亿 |
decimals | token计算支持的小数点数量 | 2,表示最小支持0.01 |
name | token名称 | DEMO |
symbol | token简称 | DE |
5.5.2 合约函数集
函数名 | 函数类型 | 函数说明 | 入参说明 | 返回值 | 备注 |
---|---|---|---|---|---|
name | 查询 | 查询token名称 | 该token的名称 | 任何账号都可以查询 | |
symbol | 查询 | 查询token简称 | 该token的简称 | 任何账号都可以查询 | |
decimals | 查询 | 查询token支持小数位数 | 该token支持的小数位数 | 任何账号都可以查询 | |
totalSupply | 查询 | 查询token发行的总量 | 该token发行的总量 | 任何账号都可以查询 | |
owner | 查询 | 查询该合约的拥有者 | 该合约的拥有者 | 任何账号都可以查询 | |
balanceOf | 查询 | 查询指定用户的token数量 | owner: 指定的用户地址 | 该地址拥有的token数量 | 任何账号都可以查询 |
transfer | 执行 | 转移指定数量token给指定账号 | to: 转入的账号地址; value: 转移的token数量 | 当前账号剩余的token数量 | 该函数只能转出自己(交易发起者)的token |
transferFrom | 执行 | 替代某账号转移指定数量token给特定账号 | from: 转出的地址; to: 转入的地址; value: 转移token数量 | from账号剩余token数量 | 该函数的交易发起者必须经过from账号的授权,即approve |
approve | 执行 | 授权账号可转移指定数量的token | spender: 被授权的用户地址 value: 允许转移的token数量 | 允许转移的token数量 | 该函数重复调用会将授权的值重置 |
allowance | 查询 | 返回指定账号从特定账号授权剩余的token数量 | owner: 授权的用户地址; spender: 被授权的用户地址 | 授权剩余的token数量 | 任何账号都可以查询 |
transferOwner | 执行 | 转移当前合约的拥有者 | to: 新的拥有者地址 | 新的拥有者地址 | 只有合约拥有者才可以发起该交易 |
mint | 执行 | 给指定账号增发token | to: 增发的用户地址 value: 增发的token数量 | 增发地址的剩余token数量 | 只有合约拥有者才可以发起该交易,该合约调用会调整发行总量 |
burn | 执行 | 销毁指定数量的token | value: 销毁的token数量 | 该账号剩余token数量 | 只能销毁交易发起者账号的token |
deliver | 执行 | 给指定账号派发token | to: 派发的用户(可选,不设置则是当前账号) value: 派发的token数量 | 该账号剩余token数量 | 只有合约拥有者才可以发起该交易,该合约调用不会影响发行总量,该操作是从合约账号中将token转出 |
address | 查询 | 返回当前用户地址 | 该用户的地址 | 任何账号都可以查询 |
5.5.3 合约使用指南
在长安链的docker-vm虚拟机模型中,交易发起者的地址算法暂未公开,因此需要用户通过手动调用合约中address()方法获取。
ERC20合约是一个发行token的合约,可以通过该合约进行指定token的发行操作。它的核心操作流程包括如下几个步骤:
- 1)发布合约:初始化合约,可在初始化合约时通过初始化参数对合约名称、简称和发行总量等信息进行设置,发行合约后,该合约中的所有token都在指定地址 CTT 中,需要通过派发操作将这些token转移出来。
- 2)派发token:调用合约的 deliver 方法可进行合约的派发,通过该方法可将token从默认地址 CTT 中转移到指定账号;
- 3)转移自己的token:调用合约的 transfer 方法可将自己的token转移给其他账号;
- 4)转移他人的token:调用 transferFrom 方法可将 他人 的token转移给指定账号,但 他人 必须给自己授权足够的token转移操作才可以,授权操作可通过 approve 函数进行;
- 5)增发token:当需要对token进行增发时,可通过调用 mint 函数来进行;
- 6)销毁token:可通过 burn 函数销毁自己的部分token;
5.6、ERC721合约
5.6.1 合约初始化
合约在初始化的过程中可以设置一些基础配置,包括发行NFT的名称、简称等信息,若不设置则会使用合约代码中默认的配置。初始化过程中涉及到的参数配置列表说明如下:
参数名 | 参数含义 | 默认值 |
---|---|---|
name | token名称 | NFT-DEMO |
symbol | token简称 | NFDO |
5.6.2 合约函数集
函数名 | 函数类型 | 函数说明 | 入参说明 | 返回值 | 备注 |
---|---|---|---|---|---|
name | 查询 | 查询NFT名称 | 该NFT的名称 | 任何账号都可以查询 | |
symbol | 查询 | 查询NFT简称 | 该NFT的简称 | 任何账号都可以查询 | |
tokenURI | 查询 | 查询指定NFT的URI配置信息 | tokenId: NFT唯一标识 | 该NFT的URI配置信息 | 任何账号都可以查询 |
totalSupply | 查询 | 查询已发布的NFT数量 | 该NFT的数量 | 任何账号都可以查询 | |
tokenByIndex | 查询 | 查询所有NFT集合中某个序号的NFT标识 | index: 该NFT在整个列表中的序号 | 对应序号的NFT标识(tokenId) | 任何账号都可以查询 |
tokenOfOwnerByIndex | 查询 | 查询某个账号下某个序号的NFT标识 | owner: 查询的账号; index: 查询的序号 | 对应序号的NFT标识(tokenId) | 任何账号都可以查询 |
balanceOf | 查询 | 查询某个地址拥有的NFT数量 | owner: 查询的账号 | 该地址拥有的NFT数量(销毁的不计算在内) | 任何账号都可以查询 |
ownerOf | 查询 | 查询某个NFT的拥有者 | tokenId: NFT唯一标识 | 拥有该NFT的地址 | 任何账号都可以查询 |
transferFrom | 执行 | 将NFT从一个地址转移至另外的地址 | from: 转出的地址(可选,不填时为当前账号); to: 转入的地址; tokenId: NFT唯一标识 | 字符串:“success” | 若from不是该NFT的拥有者需要其拥有者进行授权 |
safeTransferFrom | 执行 | 安全地将NFT从一个地址转移至另外的地址 | from: 转出的地址(可选,不填时为当前账号); to: 转入的地址; tokenId: NFT唯一标识 data: 校验的内容,通常由to地址对应用户给出,可通过setCheckData设置 | 字符串:“success” | 若from不是该NFT的拥有者需要其拥有者进行授权 |
approve | 执行 | 授权用户可代替自己操作某个NFT | approved: 被授权的账号 tokenId: 授权的的NFT唯一标识 | 字符串:“success” | 该操作会覆盖掉之前授权的账号 |
setApprovalForAll | 执行 | 设置某个用户对自己所有token的授权状态 | operator: 授权/回收授权的账号 approved: 被授权的状态,0:不授权,1:授权 | 0:不授权,1:授权 | 该授权的优先级比approve更高 |
getApproved | 查询 | 获取某个NFT授权操作的地址 | tokenId: NFT唯一标识 | 该NFT的授权操作地址 | 任何账号都可以查询,但只可查询自己的授权情况 |
isApprovedForAll | 查询 | 获取指定用户对某操作者的授权状态 | owner : 指定的用户(可选,不填代表自己) operator : 被授权的操作地址 | 0:不授权,1:授权 | 任何账号都可以查询 |
mint | 执行 | 增发指定的NFT至某个账号 | to: 增发给的账号(可选,不填时则增发给自己) tokenId: NFT唯一标识 tokenURI: NFT的URI属性 | NFT的唯一标识(tokenId) | 任何账号都可以增发,但tokenId不能重复 |
burn | 执行 | 销毁某个指定的NFT | tokenId: NFT唯一标识 | 字符串:“success” | 该账号必须是该NFT的拥有者,授权不可以 |
setTokenURI | 执行 | 设置NFT的URI属性 | tokenId: NFT唯一标识 tokenURI: NFT的URI属性 | 字符串:“success” | 该账号必须是该NFT的拥有者,授权不可以,但为保障唯一性,不建议调用该函数 |
setCheckData | 执行 | 设置账号的check数据 | data: 设置的check数据 | 字符串:“success” | 该账号只可设置自己的data,该data供safeTransferFrom中的data校验 |
checkData | 查询 | 查询设置的check数据 | 该账号设置的check数据 | 任何账号都可以查询 | |
address | 查询 | 返回当前用户地址 | 该用户的地址 | 任何账号都可以查询 |
5.6.3 合约使用指南
同ERC20合约一样,交易发起者的地址需要用户通过手动调用合约中address()方法获取。
ERC721是一个发行NFT的合约,可通过该合约发行NFT或转让NFT等操作。它的核心流程包括以下几个步骤:
- 发布合约:即初始化合约,可在初始化的时候设置该类NFT的名称(name)和简称(symbol);
- 发布NFT:调用合约的 mint 方法可发行指定的NFT,建议在发行时就设置NFT的URI信息,不建议调用 setTokenURI 进行调整;
- 授权NFT:即授权别人操作自己的NFT,可通过 approve 方法进行某个NFT的授权,也可以通过 setApprovalForAll 函数授权某个用户替代自己的所有操作,这两者中后者的优先级更高,当然用户可通过调整合约方式来实现自己的逻辑;
- 普通转移NFT:可通过调用合约的 transferFrom 方法,实现NFT的转移,若当前操作者不是对应NFT的拥有者,则需要其拥有者为当前操作者进行授权;
- 安全转移NFT:可通过调用合约的 safeTransferFrom 方法实现NFT的安全转移,所谓的安全转移是指在转移的内容中添加了 data 参数,可通过对data的校验来实现安全的操作;
- 销毁NFT:当用户不再想使用NFT时,可通过 burn 函数实现对NFT的销毁,销毁后无法找回。
6、SDK访问底链
默认的Lighthouse环境中并没有开放底链访问需要的端口,在不修改配置的环境下是12301/12302/12303/12304。如需要通过SDK访问底链,需要首先将端口开放。
6.1、放开底链访问端口
进入腾讯云该Lighthouse的管理台,选择防火墙页面。
可以看到目前只有一些基本的端口开放了,我们关注的12301-12304并没有开放,此时点击 "添加规则" 按钮,进入规则配置页面:
按照上图填写规则即可,若想限制访问来源,即哪些IP地址可以访问该端口,可以选择 启用 复选框,填入指定的源IP:
填写完成后,点击确定按钮,则会看到新创建的规则:
此时若本地使用 telnet工具进行访问,则可以发现端口已经可正常访问:
6.2、下载证书
通过WebShell登录Lighthouse服务器后,使用如下命令进入到指定组织的用户证书页面:
代码语言:shell script复制[lighthouse@VM-0-3-centos ~]$ cd /home/chainmaker/chain/release/chainmaker-v2.2.1-lh-org1.chainmaker.org/config/lh-org1.chainmaker.org/certs/user
[lighthouse@VM-0-3-centos user]$ ll
total 12
drwxr-xr-x 2 chainmaker chainmaker 4096 Jun 14 11:31 admin1
drwxr-xr-x 2 chainmaker chainmaker 4096 Jun 14 11:31 client1
drwxr-xr-x 2 chainmaker chainmaker 4096 Jun 14 11:31 light1
上述命令中的路径 chainmaker-v2.2.1-lh-org1.chainmaker.org 和 lh-org1.chainmaker.org中的org1代表的组织,用户可根据自己的组织进行调整,例如:org2对应调整为:
chainmaker-v2.2.1-lh-org2.chainmaker.org 和 lh-org2.chainmaker.org。
系统为每个组织的用户内置了三个用户:admin/client/light,分别代表了管理员、普通用户和轻节点用户。
用户可根据自己的需求进入到指定用户页面下载对应的证书,以admin为例:
代码语言:shell script复制[lighthouse@VM-0-3-centos admin1]$ cd ../
[lighthouse@VM-0-3-centos user]$ cd admin1/
[lighthouse@VM-0-3-centos admin1]$ sudo su chainmaker
[chainmaker@VM-0-3-centos admin1]$ sz *
Received - admin1.sign.crt 17.89 KB/s Spend: 0 seconds
Received - admin1.sign.key 4.43 KB/s Spend: 0 seconds
Received - admin1.tls.crt 18.36 KB/s Spend: 0 seconds
Received - admin1.tls.key 4.52 KB/s Spend: 0 seconds
特别注意的是,在下载之前需要切换为 chainmaker用户,否则会出现权限问题。
6.3、SDK使用
SDK使用可参考:https://docs.chainmaker.org.cn/dev/SDK.html