【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/

在這裏插入圖片描述

相關文章
相關標籤/搜索