您好,登錄后才能下訂單哦!
筆名輝哥 副總(賦能中心)尖晶投資
【本文目標(biāo)】
通過(guò)本文學(xué)習(xí),了解以太坊ERC1155標(biāo)準(zhǔn)規(guī)范和ERC1155Mintable可增發(fā)智能合約函數(shù)功能,并通過(guò)一個(gè)有趣的故事完成功能測(cè)試。
【前置條件】
1)對(duì)以太坊ERC20(同質(zhì)化代幣),ERC721(非同質(zhì)化代幣)有所了解,對(duì)ERC1155有興趣了解。
2) 懂得在REMIX調(diào)試SOLIDITY語(yǔ)言,不熟悉的參考文章《第十課 Solidity語(yǔ)言編輯器REMIX指導(dǎo)大全》。
#2, 概念介紹
ERC-1155的創(chuàng)造者是Enjin coin的CTO Witek Radomski。ERC1155標(biāo)準(zhǔn)定義了一種解決上述問(wèn)題的新方法。現(xiàn)在“物品”(可能包含ERC20的token或ERC721的token或兩者都有)可以被單一的一個(gè)合約(打包處理)來(lái)定義了。合約里包含區(qū)別token們所需的最小量的數(shù)據(jù)。好比,后來(lái)出現(xiàn)的視頻壓縮技術(shù),后一幀只記錄了與前一幀的不同之處,所以極大的壓縮了整個(gè)視頻的體積,合約的狀態(tài)包含了每個(gè)token ID的配置信息和管理收集的所有行為。ERC-1155的靈活性更強(qiáng),它使得開發(fā)者可以自行選擇是批量生成某一種特定的token,還是構(gòu)建不可被復(fù)制的惟一元數(shù)據(jù)。
更多描述參考文件《ERC-1155,未來(lái)游戲DApp的新一代token!》,可點(diǎn)擊查看。
#3,代碼分析
ERC1155協(xié)議主要包括ERC1155Mintable.sol同質(zhì)化可增發(fā)智能合約和ERC1155NonFungibleMintable.sol非同質(zhì)化可增發(fā)智能合約,本章只講解同質(zhì)化可增發(fā)智能合約的功能。
##3.1 代碼引用
點(diǎn)擊可獲取ERC1155Mintable.sol的完整代碼和依賴代碼。
輝哥此處給出在REMIX編譯環(huán)境能夠編譯運(yùn)行的合約代碼,對(duì)引用合約給出了絕對(duì)路徑,以便能夠在REMIX能夠編譯成功并可以單步調(diào)試。
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類圖函數(shù)說(shuō)明
主要函數(shù)功能說(shuō)明:
1) mint(string _name, uint256 _totalSupply, string _uri, uint8 _decimals, string _symbol)
增發(fā)同質(zhì)化通證
2)approve(address _spender, uint256 _id, uint256 _currentValue, uint256 _value)
授權(quán)給_spender賬戶一定額度的編號(hào)為 _id的同質(zhì)化通證,_currentValue為當(dāng)前已授權(quán)額度;
3)transferFrom(address _from, address _to, uint256 _id, uint256 _value)
擁有者從 _from地址給 _to地址轉(zhuǎn)賬授權(quán)范圍內(nèi)的一定額度的一類同質(zhì)化通證;
4)balanceOf(uint256 _id, address _owner)
擁有者_(dá)owner的 _id同質(zhì)化通證的余額;
5)allowance(uint256 _id, address _owner, address _spender)
擁有者 _owner給消費(fèi)者_(dá)spender在當(dāng)前查詢賬戶授權(quán)(approve)的額度;
6)batchApprove(address _spender, uint256[] _ids, uint256[] _currentValues, uint256[] _values)
批量授權(quán)給_spender[]一組賬戶一定額度_values[]的編號(hào)為_ids[]的同質(zhì)化通證,_currentValue[]為當(dāng)前已授權(quán)額度,這幾個(gè)數(shù)組的長(zhǎng)度要嚴(yán)格對(duì)齊;
7)batchTransferFrom(address _from, address _to, uint256[] _ids, uint256[] _values)
擁有者從 _from地址給 _to地址轉(zhuǎn)賬授權(quán)范圍內(nèi)的一定額度_values[]的各類編號(hào)為_ids[]的各類同質(zhì)化通證;
8) -batchTransfer(address _to, uint256[] _ids, uint256[] _values)
批量給目標(biāo)賬號(hào)_to轉(zhuǎn)賬各類編號(hào)為_ids[]的各類數(shù)額分別是_values[]的各類同質(zhì)化通證;
9)multicastTransfer(address[] _to, uint256[] _ids, uint256[] _values)
當(dāng)前賬號(hào)批量給目標(biāo)地址組合_to[]分別轉(zhuǎn)移額度為_values[]的各類編號(hào)為_ids[]的同質(zhì)化通證。
#4,買賣測(cè)試
為了更形象的說(shuō)明ERC1155 可增發(fā)智能合約的功能,輝哥和歐陽(yáng)哥哥,ELLA配合來(lái)完成本故事。
話說(shuō)歐陽(yáng)哥哥近期想入手仁恒濱江的大平層房子一套,但目前現(xiàn)金不夠。歐陽(yáng)哥哥想起家有祖上唐初書法家歐陽(yáng)詢知名作品《皇甫誕碑》,《九成宮》,《仲尼夢(mèng)奠帖》三幅。原作是無(wú)論如何也不能出售的,那能否限量制作若干復(fù)制品,通過(guò)區(qū)塊鏈技術(shù)進(jìn)行資產(chǎn)確權(quán)來(lái)完成限量銷售呢。
##4.1 歐陽(yáng)哥哥創(chuàng)建智能合約
說(shuō)干就干,歐陽(yáng)在REMIX歡迎編譯“ERC1155Mintable.sol”成功后,點(diǎn)擊“Create”按鈕完成“ERC1155Mintable”智能合約的創(chuàng)建。
說(shuō)明:
歐陽(yáng)哥哥的以太坊地址為“0xca35b7d915458ef540ade6068dfe2f44e8fa733c”,合約由此賬號(hào)創(chuàng)建成功。
##4.2 歐陽(yáng)哥哥增發(fā)三作品的數(shù)字資產(chǎn)
在歐陽(yáng)哥哥" 0xca35b7d915458ef540ade6068dfe2f44e8fa733c "賬戶下運(yùn)行mint()函數(shù),完成三作品的數(shù)字資產(chǎn)發(fā)布。
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")
發(fā)布成功截圖說(shuō)明:
結(jié)果驗(yàn)證:
name(1)
name(2)
name(3)
輸入id為1,2,3到name函數(shù)獲取通證的名稱分別是"HuangPuDanBei","JiuChengGong","ZhongNiMengDianTie"
結(jié)果截圖:
##4.3 輝哥購(gòu)買2幅名作復(fù)制品
輝哥最近在幣圈小賺一筆,急切想提高下自己的藝術(shù)修養(yǎng),知道歐陽(yáng)哥哥賣畫后,毫不猶豫的轉(zhuǎn)給了歐陽(yáng)100個(gè)BTC,希望能先把復(fù)制品收入囊中。
在歐陽(yáng)哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"賬戶下,運(yùn)行批量轉(zhuǎn)賬函數(shù),把“皇甫誕碑”,“九成宮”轉(zhuǎn)賬給輝哥賬號(hào) "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"。
batchTransfer("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [1,1])
轉(zhuǎn)賬截圖:
結(jié)果驗(yàn)證:
查詢輝哥賬戶的余額查詢函數(shù),獲取結(jié)果分別為1,1,0,轉(zhuǎn)賬成功。
balanceOf(1,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3,"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
結(jié)果截圖:
##4.3 輝哥當(dāng)了代理商
輝哥拿到復(fù)制品作品在朋友圈一炫,結(jié)果一堆好友打聽作品的購(gòu)買出處。輝哥覺(jué)得這應(yīng)該是一筆好生意,就跟歐陽(yáng)哥哥談起來(lái)代理合作的生意。
歐陽(yáng)哥哥對(duì)輝哥還是挺信任的,決定先把輝哥購(gòu)買的“皇甫誕碑”,“九成宮”讓他做代理看看,于是就給他設(shè)置了各1幅的權(quán)限。
1)第一次代理授權(quán)
在歐陽(yáng)哥哥賬號(hào)"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"賬戶下,運(yùn)行批量授權(quán)函數(shù),授權(quán)給輝哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
把ID為1,2的畫作通證資產(chǎn)授權(quán)給輝哥,數(shù)量分別為1,1。其當(dāng)前授權(quán)值為0,0。
batchApprove("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", [1,2], [0,0], [1,1])
結(jié)果驗(yàn)證
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,1,0,驗(yàn)證成功。
2)第二次代理授權(quán)
輝哥經(jīng)過(guò)分析評(píng)估,希望歐陽(yáng)哥哥能把“九成宮”授權(quán)數(shù)量調(diào)整為2,歐陽(yáng)哥哥也答應(yīng)了。
歐陽(yáng)哥哥賬號(hào)"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"授權(quán)輝哥"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id為2(“九成宮”作品)的資產(chǎn)數(shù)量為2(原授權(quán)數(shù)量為1)
approve("0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1, 2)
把ID為2的通證資產(chǎn)授權(quán)給user2,授權(quán)累計(jì)數(shù)量分別為2。其當(dāng)前授權(quán)值為1。
結(jié)果驗(yàn)證
allowance(1, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(2, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
allowance(3, "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,2,0。
##4.4 輝哥出售畫作給ELLA
有一天,輝哥跟幣圈新銳ELLA見(jiàn)了面,ELLA對(duì)歐陽(yáng)家的畫作很有興趣,愿意從輝哥處購(gòu)買“皇甫誕碑”,“九成宮”各一幅。
輝哥賬戶下,批量從歐陽(yáng)哥哥"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"轉(zhuǎn)賬給ELLA "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id為[1,2]的資產(chǎn)數(shù)量為[1,1]
batchTransferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", [1,2], [1,1])
代理商轉(zhuǎn)賬:
結(jié)果驗(yàn)證:
balanceOf(1, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(2, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(3, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,1,0。
##4.5 輝哥買下授權(quán)的“九成宮”畫作
畫作的生意做得越來(lái)越順,輝哥覺(jué)得直接把已授權(quán)的“九成宮”買下來(lái)算了。
在輝哥賬號(hào)下,從歐陽(yáng)賬號(hào)"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"轉(zhuǎn)賬給輝哥自己 "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"的Id為2的資產(chǎn)數(shù)量為1,把已授權(quán)的“九成宮”剩余畫作買下來(lái)。
transferFrom("0xca35b7d915458ef540ade6068dfe2f44e8fa733c", "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c", 2, 1)
結(jié)果查詢
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,2,0。
##4.6 歐陽(yáng)哥哥同時(shí)賣畫給輝哥和ELLA
ELLA對(duì)所得作品非常喜歡,希望直接找歐陽(yáng)哥哥買,不想讓輝哥做代理商賺差價(jià)。輝哥竟然也同意了。有一天,2人一起到歐陽(yáng)哥哥處,分別購(gòu)買了“九成宮”作品3幅,“仲尼夢(mèng)奠帖”作品3幅。
在歐陽(yáng)哥哥賬號(hào)"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"下,批量轉(zhuǎn)賬給輝哥賬號(hào)"0x14723a09acff6d2a60dcdf7aa4aff308fddc160c",
ELLA賬號(hào)"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"的Id為2,3(“九成宮”,“仲尼夢(mèng)奠帖”)的資產(chǎn)數(shù)量各3,3幅。
multicastTransfer(["0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"], [2,3], [3,3])
執(zhí)行如下:
結(jié)果驗(yàn)證:
balanceOf(1, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(2, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
balanceOf(3, "0x14723a09acff6d2a60dcdf7aa4aff308fddc160c")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,5,0
balanceOf(1, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(2, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
balanceOf(3, "0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db")
查詢資產(chǎn)ID為1,2,3的授權(quán)資產(chǎn)數(shù)量,余額分別為1,1,3。
##4.7 業(yè)務(wù)流程總結(jié)
用流程圖畫出上面的業(yè)務(wù)流程,如下:
【畫外音】
至此,歐陽(yáng)哥哥已賣出11幅,所得收入1100個(gè)BTC,輕松把仁恒濱江的房子收入囊中。輝哥和ELLA對(duì)入手的畫作也非常滿意,付出的BTC可以再?gòu)氖袌?chǎng)上賺回來(lái)嘛,況且現(xiàn)在處于市場(chǎng)低點(diǎn),正式建倉(cāng)的好時(shí)機(jī)。
#5,參考
1) ERC1155提案提交-GITHUB
2) ERC1155Mintable.sol合約源碼
3)ERC-1155,未來(lái)游戲DApp的新一代token!
本文章測(cè)試故事純屬虛構(gòu),歐陽(yáng)哥哥不會(huì)復(fù)制歐陽(yáng)詢書法作品用于改善生活的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。