作者介绍
笔名辉哥 副总(赋能中心)尖晶投资
1,摘要
【本文目标】
通过本文学习,了解以太坊ERC1155标准规范和ERC1155Mintable可增发智能合约函数功能,并通过一个有趣的故事完成功能测试。
【前置条件】
1)对以太坊ERC20(同质化代币),ERC721(非同质化代币)有所了解,对ERC1155有兴趣了解。
2) 懂得在REMIX调试SOLIDITY语言,不熟悉的参考文章《第十课 Solidity语言编辑器REMIX指导大全》。
#2, 概念介绍
ERC-1155的创造者是Enjin coin的CTO Witek Radomski。ERC1155标准定义了一种解决上述问题的新方法。现在“物品”(可能包含ERC20的token或ERC721的token或两者都有)可以被单一的一个合约(打包处理)来定义了。合约里包含区别token们所需的最小量的数据。好比,后来出现的视频压缩技术,后一帧只记录了与前一帧的不同之处,所以极大的压缩了整个视频的体积,合约的状态包含了每个token ID的配置信息和管理收集的所有行为。ERC-1155的灵活性更强,它使得开发者可以自行选择是批量生成某一种特定的token,还是构建不可被复制的惟一元数据。
更多描述参考文件《ERC-1155,未来游戏DApp的新一代token!》,可点击查看。
#3,代码分析
ERC1155协议主要包括ERC1155Mintable.sol同质化可增发智能合约和ERC1155NonFungibleMintable.sol非同质化可增发智能合约,本章只讲解同质化可增发智能合约的功能。
##3.1 代码引用
点击可获取ERC1155Mintable.sol的完整代码和依赖代码。
辉哥此处给出在REMIX编译环境能够编译运行的合约代码,对引用合约给出了绝对路径,以便能够在REMIX能够编译成功并可以单步调试。
pragma solidity ^0.4.24;
//import "./ERC1155.sol";
import 'https://github.com/enjin/erc-1155/contracts/ERC1155.sol';
/**
@dev Mintable form of ERC1155
Shows how easy it is to mint new items
*/
contract ERC1155Mintable is ERC1155 {
mapping (uint256 => address) public minters;
uint256 public nonce;
modifier minterOnly(uint256 _id) {
require(minters[_id] == msg.sender);
_;
}
function mint(string _name, uint256 _totalSupply, string _uri, uint8 _decimals, string _symbol)
external returns(uint256 _id) {
_id = ++nonce;
minters[_id] = msg.sender; //
items[_id].name = _name;
items[_id].totalSupply = _totalSupply;
metadataURIs[_id] = _uri;
decimals[_id] = _decimals;
symbols[_id] = _symbol;
// Grant the items to the minter
items[_id].balances[msg.sender] = _totalSupply;
}
function setURI(uint256 _id, string _uri) external minterOnly(_id) {
metadataURIs[_id] = _uri;
}
}
##3.2 ERC1155Mintable.sol类图函数说明
主要函数功能说明:
1) mint(string _name, uint256 _totalSupply, string _uri, uint8 _decimals, string _symbol)
增发同质化通证
2)approve(address _spender, uint256 _id, uint256 _currentValue, uint256 _value)
授权给_spender账户一定额度的编号为 _id的同质化通证,_currentValue为当前已授权额度;
3)transferFrom(address _from, address _to, uint256 _id, uint256 _value)
拥有者从 _from地址给 _to地址转账授权范围内的一定额度的一类同质化通证;
4)balanceOf(uint256 _id, address _owner)
拥有者_owner的 _id同质化通证的余额;
5)allowance(uint256 _id, address _owner, address _spender)
拥有者 _owner给消费者_spender在当前查询账户授权(approve)的额度;
6)batchApprove(address _spender, uint256[] _ids, uint256[] _currentValues, uint256[] _values)
批量授权给_spender[]一组账户一定额度_values[]的编号为_ids[]的同质化通证,_currentValue[]为当前已授权额度,这几个数组的长度要严格对齐;
7)batchTransferFrom(address _from, address _to, uint256[] _ids, uint256[] _values)
拥有者从 _from地址给 _to地址转账授权范围内的一定额度_values[]的各类编号为_ids[]的各类同质化通证;
8) -batchTransfer(address _to, uint256[] _ids, uint256[] _values)
批量给目标账号_to转账各类编号为_ids[]的各类数额分别是_values[]的各类同质化通证;
9)multicastTransfer(address[] _to, uint256[] _ids, uint256[] _values)
当前账号批量给目标地址组合_to[]分别转移额度为_values[]的各类编号为_ids[]的同质化通证。
#4,买卖测试
为了更形象的说明ERC1155 可增发智能合约的功能,辉哥和欧阳哥哥,ELLA配合来完成本故事。
话说欧阳哥哥近期想入手仁恒滨江的大平层房子一套,但目前现金不够。欧阳哥哥想起家有祖上唐初书法家欧阳询知名作品《皇甫诞碑》,《九成宫》,《仲尼梦奠帖》三幅。原作是无论如何也不能出售的,那能否限量制作若干复制品,通过区块链技术进行资产确权来完成限量销售呢。
##4.1 欧阳哥哥创建智能合约
说干就干,欧阳在REMIX欢迎编译“ERC1155Mintable.sol”成功后,点击“Create”按钮完成“ERC1155Mintable”智能合约的创建。
说明:
欧阳哥哥的以太坊地址为“0xca35b7d915458ef540ade6068dfe2f44e8fa733c”,合约由此账号创建成功。
##4.2 欧阳哥哥增发三作品的数字资产
在欧阳哥哥" 0xca35b7d915458ef540ade6068dfe2f44e8fa733c "账户下运行mint()函数,完成三作品的数字资产发布。
mint("HuangPuDanBei", 5, "http://img688.ph.126.net/AQpGPSuvKQUJJnQO5OOovg==/1159958379025162213.jpg", 0, "HPDB")
mint("JiuChengGong", 200, "http://image106.360doc.com/DownloadImg/2017/06/0600/101000542_3.jpg", 0, "JCG")
mint("ZhongNiMengDianTie", 1000000, "http://img8.ph.126.net/hIyr_YwiPqSmDTImf_KEUw==/6597582139075295968.jpg", 0, "ZNMDT")
发布成功截图说明:
结果验证:
name(1)
name(2)
name(3)
输入id为1,2,3到name函数获取通证的名称分别是"HuangPuDanBei","JiuChengGong","ZhongNiMengDianTie"
结果截图:
##4.3 辉哥购买2幅名作复制品
辉哥最近在币圈小赚一笔,急切想提高下自己的艺术修养,知道欧阳哥哥卖画后,毫不犹豫的转给了欧阳100个BTC,希望能先把复制品收入囊中。
在欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"账户下,运行批量转账函数,把“皇甫诞碑”,“九成宫”转账给辉哥账号 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"。
batchTransfer("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [1,1])
转账截图:
结果验证:
查询辉哥账户的余额查询函数,获取结果分别为1,1,0,转账成功。
balanceOf(1,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
结果截图:
##4.3 辉哥当了代理商
辉哥拿到复制品作品在朋友圈一炫,结果一堆好友打听作品的购买出处。辉哥觉得这应该是一笔好生意,就跟欧阳哥哥谈起来代理合作的生意。
欧阳哥哥对辉哥还是挺信任的,决定先把辉哥购买的“皇甫诞碑”,“九成宫”让他做代理看看,于是就给他设置了各1幅的权限。
1)第一次代理授权
在欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"账户下,运行批量授权函数,授权给辉哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
把ID为1,2的画作通证资产授权给辉哥,数量分别为1,1。其当前授权值为0,0。
batchApprove("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [0,0], [1,1])
结果验证
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查询资产ID为1,2,3的授权资产数量,余额分别为1,1,0,验证成功。
2)第二次代理授权
辉哥经过分析评估,希望欧阳哥哥能把“九成宫”授权数量调整为2,欧阳哥哥也答应了。
欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"授权辉哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id为2(“九成宫”作品)的资产数量为2(原授权数量为1)
approve("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1, 2)
把ID为2的通证资产授权给user2,授权累计数量分别为2。其当前授权值为1。
结果验证
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查询资产ID为1,2,3的授权资产数量,余额分别为1,2,0。
##4.4 辉哥出售画作给ELLA
有一天,辉哥跟币圈新锐ELLA见了面,ELLA对欧阳家的画作很有兴趣,愿意从辉哥处购买“皇甫诞碑”,“九成宫”各一幅。
辉哥账户下,批量从欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"转账给ELLA "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为[1,2]的资产数量为[1,1]
batchTransferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", [1,2], [1,1])
balanceOf(1, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(2, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(3, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
查询资产ID为1,2,3的授权资产数量,余额分别为1,1,0。
##4.5 辉哥买下授权的“九成宫”画作
画作的生意做得越来越顺,辉哥觉得直接把已授权的“九成宫”买下来算了。
在辉哥账号下,从欧阳账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"转账给辉哥自己 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id为2的资产数量为1,把已授权的“九成宫”剩余画作买下来。
transferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1)
结果查询
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查询资产ID为1,2,3的授权资产数量,余额分别为1,2,0。
##4.6 欧阳哥哥同时卖画给辉哥和ELLA
ELLA对所得作品非常喜欢,希望直接找欧阳哥哥买,不想让辉哥做代理商赚差价。辉哥竟然也同意了。有一天,2人一起到欧阳哥哥处,分别购买了“九成宫”作品3幅,“仲尼梦奠帖”作品3幅。
在欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"下,批量转账给辉哥账号"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
ELLA账号"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为2,3(“九成宫”,“仲尼梦奠帖”)的资产数量各3,3幅。
multicastTransfer(["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"], [2,3], [3,3])
结果验证:
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查询资产ID为1,2,3的授权资产数量,余额分别为1,5,0
balanceOf(1, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(2, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(3, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
查询资产ID为1,2,3的授权资产数量,余额分别为1,1,3。
【画外音】
至此,欧阳哥哥已卖出11幅,所得收入1100个BTC,轻松把仁恒滨江的房子收入囊中。辉哥和ELLA对入手的画作也非常满意,付出的BTC可以再从市场上赚回来嘛,况且现在处于市场低点,正式建仓的好时机。
#5,参考
1) ERC1155提案提交-GITHUB
2) ERC1155Mintable.sol合约源码
3)ERC-1155,未来游戏DApp的新一代token!
本文章测试故事纯属虚构,欧阳哥哥不会复制欧阳询书法作品用于改善生活的。