1、整体介绍
Lighthouse 长安链发布上线后在社区广受好评,同时也有不少社区朋友前来咨询小编如何基于Lighthouse 长安链开发自己的应用,比如区块链数字藏品、区块链存证、区块链游戏等等,那必须得安排。
因此我们将持续的根据应用场景推出教程文章。
其中数字藏品是指使用区块链技术,对特定的作品、艺术品生成的在区块链上生成唯一数字凭证,本文将将讲述如何通过Lighthouse 长安链镜像,在长安链上快速发行数字藏品。
主要内容如下:
- 购买lighthouse长安链镜像,自动部署长安链和长安链管理台应用
- 准备好所要发行的数字藏品的基本信息
- 登录长安链管理台,通过可视化界面发行和管理数字藏品
2、购买Lighthouse 长安链服务
我们首先在腾讯云Lighthouse轻量应用服务器购买页面,购买一台服务器。如下图所示。
服务器具体配置如下
- 镜像类型:应用镜像
- 应用名称:长安链Chainmaker
点击立即购买,按步骤付款之后,即可在自己购买的腾讯云服务器上拥有了一套长安链环境。
3、通过长安链管理台发行数字藏品
此处我们以给账户地址为:0x96759b16ab543551D06B5E6B0E4f887C9401b651
的用户派发以下图为基础生成的数字藏品为例
3.1、登录长安链管理台
进入Lighthouse(轻量应用服务器)控制台,在服务器模块找到自己购买的长安链服务,点击进入服务详情。
在应用管理里,找到长安链管理台应用,其中
- 登录地址为该管理台的访问地址
- 默认到账户名为admin,默认密码可点击登录按钮,登录到服务器内并输入如下指令获取密码。
cat /home/chainmaker/credentials.txt
使用上文获取到的账户和密码登录管理台。
3.2、查看长安链
登录后在区块链管理处,可看到已经内置部署的长安链,主要配置信息如下
序号 | 内容 | 说明 |
---|---|---|
1 | 长安链版本 | V2.2.1 |
2 | 链id | chain1 |
3 | 组织数 | 4个组织 |
4 | 节点数 | 4个共识节点 |
5 | 共识算法 | TBFT |
6 | 单区块最大交易容量 | 100笔交易 |
7 | 交易过期时长 | 600s |
8 | 交易间隔 | 2000ms |
9 | 是否支持docker_VM | 支持 |
3.3、查看智能合约
- 进入区块链管理-合约管理的界面,可以看到已经内置部署的几个常用的智能合约。包含存证合约,转账合约,ERC-20合约,ERC-721合约。
- 合约的源代码及详细介绍,可查看合约介绍章节。
3.4、使用智能合约发行数字藏品
切换到区块链管理-上链管理界面,点击发起上链按钮,调用已经安装的ERC-721合约发行新的数字藏品。
- 然后再选择数字藏品(ERC-721)合约,并选择调用
mint
合约方法,然后输入所需的参数。其中:- 接收人:0x96759b16ab543551D06B5E6B0E4f887C9401b651
- tokenid:该数字藏品图片的SHA256哈希值。
- tokenRUI:以如下json串为值
{
"name": "testNFT",
"description": "演示发行新的数字藏品",
"metadata": [
{
"name": "lzsqh9fevc.jepg",
"ext": "jepg",
"size": "532480",
"uri": "https://ask.qcloudimg.com/http-save/2491414/lzsqh9fevc.jpeg?imageView2/2/w/1620",
"sha256": "385dd7718daf8a5ff38584659a846697d05a7e6bfd8a0c8a01bc9ef3de5f1480"
}
]
}
- 点击确认,即完成发行新数字藏品的过程。发送成功后,可到区块链浏览器里查看详情。
3.6、管理数字藏品
除了发行数字藏品外还可通过管理台管理数字藏品,如查询、销毁,转让等。可根据实际的需求,在发起上链处,选择不同的合约方法,传入对应的参数进行管理操作。
此外,也支持通过长安链SDK等方式,直接调用智能合约,发行并管理数字藏品。
3.7、部署新的智能合约
若有部署新的智能合约(包含但不限于数字藏品类的合约)的需求,可以通过长安链管理台或者SDK将合约部署到长安链在进行管理。
4、数字藏品(ERC721)合约介绍
4.1、合约列表
目前在lighthouse 长安链中预先部署了4个示例合约,如下表所示:
序号 | 合约名称 | 合约功能 |
---|---|---|
1 | SaveContract | 存证合约,可保存Key-Value及描述信息 |
2 | TransferContract | 普通转账合约,用于普通的转账业务,无权限等相关设计 |
3 | ERC20Contract | ERC20合约,基本符合以太坊官方标准,可作为Token发布的Demo |
4 | ERC721Contract | ERC721合约,基本符合以太坊官方标准,可作为NFT发布的Demo |
并在 /home/chainmaker/contract/demos
目录中,放置了合约源码,及部分单元测试代码
下文我们主要介绍下数字藏品(ERC721)合约。
4.2 合约初始化
合约在初始化的过程中可以设置一些基础配置,包括发行NFT的名称、简称等信息,若不设置则会使用合约代码中默认的配置。初始化过程中涉及到的参数配置列表说明如下:
参数名 | 参数含义 | 默认值 |
---|---|---|
name | token名称 | NFT-DEMO |
symbol | token简称 | NFDO |
4.3 合约函数集
函数名 | 函数类型 | 函数说明 | 入参说明 | 返回值 | 备注 |
---|---|---|---|---|---|
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 | 查询 | 返回当前用户地址 | 该用户的地址 | 任何账号都可以查询 |
4.4 合约使用指南
交易发起者的地址需要用户通过调用合约中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的销毁,销毁后无法找回。