【ERC1155实践】欧阳询书法复制品从确权设计到买卖测试

【ERC1155实践】欧阳询书法复制品从确权设计到买卖测试

做者介绍

笔名辉哥 副总(赋能中心)尖晶投资git

1,摘要

【本文目标】
经过本文学习,了解以太坊ERC1155标准规范和ERC1155Mintable可增发智能合约函数功能,并经过一个有趣的故事完成功能测试。github

【前置条件】
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可以编译成功并能够单步调试。app

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类图函数说明
ERC1155Mintable.sol类图dom

主要函数功能说明:
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配合来完成本故事。
欧阳询头像ide

话说欧阳哥哥近期想入手仁恒滨江的大平层房子一套,但目前现金不够。欧阳哥哥想起家有祖上唐初书法家欧阳询知名做品《皇甫诞碑》《九成宫》《仲尼梦奠帖》三幅。原做是不管如何也不能出售的,那可否限量制做若干复制品,经过区块链技术进行资产确权来完成限量销售呢。
皇甫诞碑函数

九成宫

仲尼梦奠帖

##4.1 欧阳哥哥建立智能合约
说干就干,欧阳在REMIX欢迎编译“ERC1155Mintable.sol”成功后,点击“Create”按钮完成“ERC1155Mintable”智能合约的建立。
说明:
欧阳哥哥的以太坊地址为“0xca35b7d915458ef540ade6068dfe2f44e8fa733c”,合约由此帐号建立成功。学习

1. 建立ERC1155智能合约

##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")

发布成功截图说明:

2. 发布三类资产

结果验证:

name(1)
name(2)
name(3)

输入id为1,2,3到name函数获取通证的名称分别是"HuangPuDanBei","JiuChengGong","ZhongNiMengDianTie"
结果截图:

3. 查询资产名称

##4.3 辉哥购买2幅名做复制品
辉哥最近在币圈小赚一笔,急切想提升下本身的艺术修养,知道欧阳哥哥卖画后,坚决果断的转给了欧阳100个BTC,但愿能先把复制品收入囊中。
在欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"帐户下,运行批量转帐函数,把“皇甫诞碑”,“九成宫”转帐给辉哥帐号 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"。

batchTransfer("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [1,1])

转帐截图:

4. 批量转帐

结果验证:
查询辉哥帐户的余额查询函数,获取结果分别为1,1,0,转帐成功。

balanceOf(1,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

结果截图:

5. 转帐结果

##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,验证成功。

6. 受权结果

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。

7. 从新查询受权数量

##4.4 辉哥出售画做给ELLA
有一天,辉哥跟币圈新锐ELLA见了面,ELLA对欧阳家的画做颇有兴趣,愿意从辉哥处购买“皇甫诞碑”,“九成宫”各一幅。
辉哥帐户下,批量从欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"转帐给ELLA "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为[1,2]的资产数量为[1,1]

batchTransferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", [1,2], [1,1])

代理商转帐:
8. 代理转帐
结果验证:

balanceOf(1, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(2, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(3, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")

查询资产ID为1,2,3的受权资产数量,余额分别为1,1,0。

9.ELLA帐户余额查询

##4.5 辉哥买下受权的“九成宫”画做
画做的生意作得愈来愈顺,辉哥以为直接把已受权的“九成宫”买下来算了。
在辉哥帐号下,从欧阳帐号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"转帐给辉哥本身 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id为2的资产数量为1,把已受权的“九成宫”剩余画做买下来。

transferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1)

10.代理商买下画做

结果查询

balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

查询资产ID为1,2,3的受权资产数量,余额分别为1,2,0。
11. 代理商余额查询

##4.6 欧阳哥哥同时卖画给辉哥和ELLA
ELLA对所得做品很是喜欢,但愿直接找欧阳哥哥买,不想让辉哥作代理商赚差价。辉哥居然也赞成了。有一天,2人一块儿到欧阳哥哥处,分别购买了“九成宫”做品3幅,“仲尼梦奠帖”做品3幅。
在欧阳哥哥帐号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"下,批量转帐给辉哥帐号"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
ELLA帐号"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为2,3(“九成宫”,“仲尼梦奠帖”)的资产数量各3,3幅。

multicastTransfer(["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"], [2,3], [3,3])

执行以下:
12.批量给多人转让

结果验证:

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。

##4.7 业务流程总结
用流程图画出上面的业务流程,以下:
ERC1155测试流程图

【画外音】
至此,欧阳哥哥已卖出11幅,所得收入1100个BTC,轻松把仁恒滨江的房子收入囊中。辉哥和ELLA对入手的画做也很是满意,付出的BTC能够再从市场上赚回来嘛,何况如今处于市场低点,正式建仓的好时机。

#5,参考
1) ERC1155提案提交-GITHUB
2) ERC1155Mintable.sol合约源码
3)ERC-1155,将来游戏DApp的新一代token!

本文章测试故事纯属虚构,欧阳哥哥不会复制欧阳询书法做品用于改善生活的。

添加微信(cdong1024),加入区块链开发者技术交流群

虫洞社区:https://www.uzanapp.com/

在这里插入图片描述