前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第二十课 【ERC1155实践】欧阳询书法复制品从确权设计到买卖测试

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

作者头像
辉哥
发布2018-08-22 11:08:01
1.3K1
发布2018-08-22 11:08:01
举报
文章被收录于专栏:区块链入门

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能够编译成功并可以单步调试。

代码语言:javascript
复制
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()函数,完成三作品的数字资产发布。

代码语言:javascript
复制
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")

发布成功截图说明:

  1. 发布三类资产

结果验证:

代码语言:javascript
复制
name(1)
name(2)
name(3)

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

结果截图:

  1. 查询资产名称

4.3 辉哥购买2幅名作复制品

辉哥最近在币圈小赚一笔,急切想提高下自己的艺术修养,知道欧阳哥哥卖画后,毫不犹豫的转给了欧阳100个BTC,希望能先把复制品收入囊中。

在欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"账户下,运行批量转账函数,把“皇甫诞碑”,“九成宫”转账给辉哥账号 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"。

代码语言:javascript
复制
batchTransfer("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [1,1])

转账截图:

  1. 批量转账

结果验证:

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

代码语言:javascript
复制
balanceOf(1,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

结果截图:

  1. 转账结果

4.3 辉哥当了代理商

辉哥拿到复制品作品在朋友圈一炫,结果一堆好友打听作品的购买出处。辉哥觉得这应该是一笔好生意,就跟欧阳哥哥谈起来代理合作的生意。

欧阳哥哥对辉哥还是挺信任的,决定先把辉哥购买的“皇甫诞碑”,“九成宫”让他做代理看看,于是就给他设置了各1幅的权限。

1)第一次代理授权

在欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"账户下,运行批量授权函数,授权给辉哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",

把ID为1,2的画作通证资产授权给辉哥,数量分别为1,1。其当前授权值为0,0。

代码语言:javascript
复制
batchApprove("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [0,0], [1,1])

结果验证

代码语言:javascript
复制
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

查询资产ID为1,2,3的授权资产数量,余额分别为1,1,0,验证成功。

  1. 授权结果

2)第二次代理授权

辉哥经过分析评估,希望欧阳哥哥能把“九成宫”授权数量调整为2,欧阳哥哥也答应了。

欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"授权辉哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id为2(“九成宫”作品)的资产数量为2(原授权数量为1)

代码语言:javascript
复制
approve("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1, 2)

把ID为2的通证资产授权给user2,授权累计数量分别为2。其当前授权值为1。

结果验证

代码语言:javascript
复制
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

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

  1. 重新查询授权数量

4.4 辉哥出售画作给ELLA

有一天,辉哥跟币圈新锐ELLA见了面,ELLA对欧阳家的画作很有兴趣,愿意从辉哥处购买“皇甫诞碑”,“九成宫”各一幅。

辉哥账户下,批量从欧阳哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"转账给ELLA "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为1,2的资产数量为1,1

代码语言:javascript
复制
batchTransferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", [1,2], [1,1])

代理商转账:

  1. 代理转账

结果验证:

代码语言:javascript
复制
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,把已授权的“九成宫”剩余画作买下来。

代码语言:javascript
复制
transferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1)

10.代理商买下画作

结果查询

代码语言:javascript
复制
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

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

  1. 代理商余额查询

4.6 欧阳哥哥同时卖画给辉哥和ELLA

ELLA对所得作品非常喜欢,希望直接找欧阳哥哥买,不想让辉哥做代理商赚差价。辉哥竟然也同意了。有一天,2人一起到欧阳哥哥处,分别购买了“九成宫”作品3幅,“仲尼梦奠帖”作品3幅。

在欧阳哥哥账号"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"下,批量转账给辉哥账号"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",

ELLA账号"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id为2,3(“九成宫”,“仲尼梦奠帖”)的资产数量各3,3幅。

代码语言:javascript
复制
multicastTransfer(["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"], [2,3], [3,3])

执行如下:

12.批量给多人转让

结果验证:

代码语言:javascript
复制
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")

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

代码语言:javascript
复制
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!

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.08.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,摘要
  • 2, 概念介绍
  • 3,代码分析
    • 3.1 代码引用
      • 3.2 ERC1155Mintable.sol类图函数说明
      • 4,买卖测试
        • 4.1 欧阳哥哥创建智能合约
          • 4.2 欧阳哥哥增发三作品的数字资产
            • 4.3 辉哥购买2幅名作复制品
              • 4.3 辉哥当了代理商
                • 4.4 辉哥出售画作给ELLA
                  • 4.5 辉哥买下授权的“九成宫”画作
                    • 4.6 欧阳哥哥同时卖画给辉哥和ELLA
                    • 5,参考
                    相关产品与服务
                    腾讯云区块链服务平台 TBaaS
                    腾讯云区块链服务平台(Tencent Blockchain as a Service,简称TBaaS)致力于打造全球领先的企业级区块链技术平台,帮助客户、开发者及合作伙伴轻松创建和管理可托管、可扩展的区块链网络,助力产业协同发展。TBaaS 支持长安链·ChainMaker、Hyperledger Fabric等区块链底层平台,简化部署、运维及开发流程,实现业务快速上链,提升链上治理效率。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档