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

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类图函数说明

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”,合约由此账号创建成功。

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!

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容