第二十課 【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,還是構建不可被複制的惟一元資料。
更多描述參考檔案
#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
#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。
##4.7 業務流程總結 用流程圖畫出上面的業務流程,如下:
【畫外音】 至此,歐陽哥哥已賣出11幅,所得收入1100個BTC,輕鬆把仁恆濱江的房子收入囊中。輝哥和ELLA對入手的畫作也非常滿意,付出的BTC可以再從市場上賺回來嘛,況且現在處於市場低點,正式建倉的好時機。
本文章測試故事純屬虛構,歐陽哥哥不會複製歐陽詢書法作品用於改善生活的。