ERC-3525标准是以太坊社区批准通过的半匀质化通证标准,由SolvProtocol提出。
ERC-3525标准定义了一类新型的数字资产,具有以下突出优势:
与ERC-721标准兼容,具有唯一ID和可视化外观,可复用现有的大量NFT基础设施;可拆分、可合并、可计算;具有账户特征,可以容纳其他数字资产,如ERC-20通证、NFT等,并支持在若干SFT之间的转账操作;可以对外观、功能、资产存储、锁定、转账等各方面进行编程,并且为元数据的结构化进行了特别的优化,以支持动态变化、复杂金融逻辑等高级功能的开发。由于具有以上的优势,ERC-3525特别适合用来描述金融工具、数字票证、数字合同等高级数字资产,同时也正在被试用于Web3虚拟物品、动态NFT艺术品、虚拟装备、真实世界资产通证化等领域,得到了非常广泛的关注。
SolvProtocol已经将ERC-3525参考实现开源,为有兴趣了解和快速尝试这一全新通证技术的开发者提供有力的支持。这一参考实现同时以开源代码库和NPM模块包的形式提供,开发者可以以此为起点,在这个参考实现代码的基础之上通过改写和扩展,开发自己的ERC-3525应用。
本文档引导读者安装、配置和部署ERC-3525官方参考实现,并引导读者在此基础上开发一个简单的ERC-3525通证合约。这个合约没有任何特别的功能,但开发、测试和部署这个合约的过程却是通用的。开发者如果了解和熟练掌握了这个开发过程,就能够在此基础上开发复杂的、具有业务功能的ERC-3525通证合约了。
本文档内容基于ERC-3525参考实现?1.1.0版。
预备知识和技能
ERC-3525参考实现是基于Hardhat框架、以Solidity语言为主开发的。我们推荐读者在学习ERC-3525开发之前,首先掌握以下知识和技能:
Solidity语言和EVM智能合约开发的基本知识Hardhat智能合约开发框架的基本实用技能当然,要使用Hardhat框架,也必须对于JavaScript或者TypeScript语言有基本的了解。本文档使用TypeScript进行介绍,但对于有经验的开发者来说,基于本文档介绍的内容,很容易可以用JavaScript完成相同的工作。
我们推荐对于Hardhat不熟悉的读者首先通过Hardhat的官方文档(https://hardhat.org/docs)来熟悉这一流行的智能合约开发框架。
快速入门
1.开发环境
建议读者在macOS或Linux的命令行环境下进行ERC-3525开发。如果读者使用Windows,我们强烈建议读者首先安装WindowsSubsystemforLinux,然后在WSL环境中进行如下操作。
读者可以选择自己喜欢的任何一种代码编辑工具来编写代码,但我们推荐使用VisualStudioCode,因为Hardhat的开发者NomicFoundation为VisualStudioCode开发了一款Solidity插件,可以帮助提升Solidity和Hardhat开发效率。
此外,Hardhat开发中大量使用JavaScript或者TypeScript编写测试用例,VisualStudioCode本身对于JavaScript和TypeScript就提供了良好的支持。
数字资产研究院孟岩:数字经济的下半场是要素市场的数字化:8月25日,火币大学主办的区块链数字精英实训营正式开课。数字资产研究院副院长、火币大学顾问孟岩以《区块链、数字资产与开放金融》为主题进行授课。
孟岩表示,数字经济的上半场是产品市场的数字化,到目前为止主要的互联网变革都发生在这个市场中。而数字经济的下半场是要素市场的数字化,数据要素化将改变经济增长逻辑和财富分配逻辑,所有生产要素都要折叠成为数字资产。数字化要素市场的全球化一方面打破原有的边界,另一方面引发新的经济霸权竞争,数字化要素市场规模将达到数字化产品市场的100+倍。[2020/8/25]
2.创建HardhatTypeScript项目
首先在命令行环境下通过如下命令准备项目目录。本示例项目名称为erc3525-getting-started。kdirec352
在命令行输入以下命令
将看到以下界面
选择“CreateaTypeScriptproject”后,Hardhat会提示若干问题,读者直接通过回车选择缺省选项即可。
全部选择完毕后,系统自动执行一系列安装和准备工作。结束后,使用VisualStudioCode打开目录,你可以看到如下项目结构:
3.引入和安装ERC-3525参考实现模块包
下面,通过npm命令在当前目录安装ERC-3525参考实现
npminstallfrom"from"chai";
import{ethers}from"hardhat";
describe("ERC3525GettingStarted",function(){
?//Wedefineafixturetoreusethesamesetupineverytest.
?//WeuseloadFixturetorunthissetuponce,snapshotthatstate,
?//andresetHardhatNetworktothatsnapshotineverytest.
?asyncfunctiondeployGettingStartedFixture(){
??//Contractsaredeployedusingthefirstsigner/accountbydefault
??const=awaitethers.getSigners();
??constGettingStarted=awaitethers.getContractFactory(
孟岩:算力是新数字经济的支点:金色财经现场报道,8月22日,在成都举办的“全球区块链算力大会暨新基建矿业峰会”上,数字资产研究院副院长、通证思维实验室发起人孟岩做了主题为《算力是新数字经济的支点》的演讲。孟岩表示,中心化数字经济的主要缺陷是算力不足,而开放数字经济的优势就是算力规模,目前数据已成为生产要素之一,其用意就是要提升算力。当前的算力已从哈希算力过渡到交易算力,未来将发展成为广义算力,Filecoin将开启广义算力的发展大幕。[2020/8/22]
??????"ERC3525GettingStarted");
??constgettingStarted=awaitGettingStarted.deploy(owner.address);
??return{gettingStarted,owner,otherAccount};
?}
?describe("Deployment",function(){
??it("Shouldsettherightowner",asyncfunction(){
???const{gettingStarted,owner}=awaitloadFixture(
????????deployGettingStartedFixture);
???expect(awaitgettingStarted.owner()).to.equal(owner.address);
??});
?});
?describe("Mintable",function(){
??describe("Validations",function(){
???it("Shouldrevertwithnotowner",asyncfunction(){
????const{gettingStarted,owner,otherAccount}=?
??????????awaitloadFixture(deployGettingStartedFixture);
????constslot=3525
????constvalue=ethers.utils.parseEther("9.5");
????awaitexpect(
??????????gettingStarted.connect(otherAccount)
????????????????????????.mint(owner.address,slot,value))
????????????????????????.to.be.revertedWith(
?????"ERC3525GettingStarted:onlyownercanmint"
????);
???});
??});
??describe("Mint",function(){
???it("Shouldminttootheraccount",asyncfunction(){
????const{gettingStarted,owner,otherAccount}=?
声音 | 孟岩:中国完全可能成为全球数字经济变革的领头羊:10月26日讯,数字资产研究院副院长孟岩发表评论:首先是很激动、很兴奋,这是改变行业、改变世界的一天。习主席站在战略和时代的高度上,一锤定音,给中国区块链发展确定了方向。我们在这个行业的逆境中奋斗了两年多,即使在被误解的艰难时刻中,也没有放弃和动摇,就是因为我们不但相信区块链的潜力和未来,也相信中国区块链能够迎来这一天。现在我们非常有信心,在习主席的定调之下,中国完全可能成为全球数字经济变革的领头羊。
其次,我们觉得要客观估计我们面临的局面,我们事实上已经处于一场数字经济军备竞赛当中,既要充分估计其挑战,也要有充分自信。Libra 推出之后,我在一些内部交流中,将 Libra 比作数字经济时代的太空竞赛、星球大战计划,急切的期盼我国能够发挥体制、人才和技术的优势,积极迎战,并且相信这样的竞争,虽然将会很激烈,但最终将会极大地推动中国和世界的数字经济发展水平,启动新的经济增长引擎,让老百姓过得更幸福。我没有想到我们国家能够这么快的作出反应,这是非常令人振奋的。但与此同时,不要低估这件事情的难度和挑战性。
第三,越是繁花似锦、掌声雷动的时候,越是要冷静。习总书记讲话消息发表之后,很多人又开始念歪经,说实在的,看到的某些言论令我担忧。我想提醒整个行业,今天这个局面来之何其不易?如果不加强学习,加强自律,真正理解国家战略,还是沿着之前一而再、再而三被证明是走不通的死路去胡搞,恐怕这来之不易的局面会被玩坏,那时候不单是我们这个行业追悔莫及,而且可能会危机中国数字经济战略的大局。
第四,这一次我们有信心,无论是技术上,还是思想理论体系上,无论是基础设施建设,还是应用实践,我们有能力跟老外华山论剑,有能力创造出一批世界领先,出现一大批世界级的科学家、企业家和学者。当然,我认为这一切要在充分对外开放的前提下进行。开放是高水平竞争的必要条件。我本人希望跟大家一起把区块链通证经济、自协组织、开放金融的理论和实践体系化、方法化、学科化,不但在中国取得成功,而且获得世界的认可和尊敬。[2019/10/26]
??????????awaitloadFixture(deployGettingStartedFixture);
????constslot=3525
????constvalue=awaitethers.utils.parseEther("9.5");
????awaitgettingStarted.mint(otherAccount.address,slot,value);
????expect(awaitgettingStarted(1)).to.eq(value);
????expect(awaitgettingStarted.slotOf(1)).to.eq(slot);
????expect(awaitgettingStarted.ownerOf(1))
???????????????????????????????????.to.eq(otherAccount.address);
???});
??});
?});
});
在上面的测试代码中,我们编写了一个测试夹具和三个测试用例,分别测试了owner的正确性、mint的操作权限和mint操作的功能。这些用例遵循了Hardhat中编写智能合约测试代码的标准方式,读者可通过Hardhat官方文档学习,此处不再赘述。
声音 | CSDN副总裁孟岩:进入区块链领域的人太年轻 社会资源太少无法结合实体经济:近日,CSDN副总裁孟岩接受采访时称:“2019年变化太大了,首先是区块链走下了神坛,人们认识到区块链的应用空间并没有 1-2 月份时想象的那么广泛。其次,我觉得进入这个领域的人太年轻了,以 90 后为主,这是好事也是坏事。坏就坏在这些年轻人手里没多少社会资源,无法结合实体经济,只能做一些炒币、虚的东西。不过也多亏了这个社群,吸引了一大批传统产业的成年人,他们的思维、业务做的都很沉稳,是能用区块链创造新价值的。”[2019/1/2]
6.运行测试
下面实际运行测试。方法是在项目主目录执行如下命令:
npxhardhattest
执行结果如下:
这表明我们的智能合约成功通过了所有三个测试用例。
7.添加SVG图像
ERC-3525最初的设计目标是表达复杂的金融资产,特别是数字票据。既然是数字资产,就必须支持可拆分、可合并,能够像ERC-20通证一样进行各种数学计算。另一方面,ERC-3525超越ERC-20的重要一点,就是具有可视化的外在形象,唯有如此才能够向用户传达丰富的信息,使复杂数字资产的复杂性能够被表达出来。这是ERC-3525选择兼容ERC-721的主要动机。因此,ERC-3525支持元数据,并且通过从IERC721Metadata接口继承而来的tokenURI函数返回资源的URL,或者直接返回图片的内容数据。在NFT当中,普遍的做法是将图片放在链外的存储上,然后让tokenURI函数返回其URL。这种设计其实有一个非常大的风险,就是在NFT出售以后,控制存储的人可以更换URL上的图片,这样买家手里的NFT实际上就被篡改了。为了解决这个问题,大多数NFT采用了IPFS存储,通过哈希值来确保图片资源的唯一性。即使如此,也难以防范一些破坏,比如将IPFS上存储的图片资源删除。
ERC-3525的设计初衷是为了表达金融资产,金融资产的信息非常敏感和重要,决不能被更换和删除。因此,Solv建议直接将展现层用SVG表达,并直接放在链上。具体方法就是让tokenURI函数直接返回SVG代码片段,而不是指向图像资源的链接。
在ERC3525GettingStarted合约中加入以下函数:
??functiontokenURI(uint256tokenId_)publicviewvirtualoverridereturns(stringmemory){
????returnstring(
??????abi.encodePacked(
????????'<svgwidth="600"height="600"xmlns="http://www.w3.org/2000/svg">',
????????'<g><title>Layer1</title>',
????????'?<rectid="svg_1"height="600"width="600"y="0"x="0"stroke="#000"fill="#000000"/>',
????????'?<textxml:space="preserve"text-anchor="start"font-family="NotoSansJP"font-size="24"id="svg_2"y="340"x="200"stroke-width="0"stroke="#000"fill="#ffffff">TokenId:',
声音 | CSDN副总裁孟岩:比特币的市场价值会回归到应用价值上:CSDN副总裁、自由研究者孟岩在接受采访时表示,比特币能涨多高这个问题,我觉得它的市场价值会回归到应用价值上,不会再有那么大的投机属性。这是因为在以前买币实际上就是做多,市场缺乏衍生品、做空的玩法。现在各个平台纷纷上线合约交易。当比特币价格开始超过合理的范围的时候,市场上就会有人大量做空,这个价值发现机制就不会让比特币涨得过于离谱。[2019/1/2]
????????tokenId_.toString(),
????????'</text>',
????????'?<textxml:space="preserve"text-anchor="start"font-family="NotoSansJP"font-size="24"id="svg_3"y="410"x="200"stroke-width="0"stroke="#000"fill="#ffffff">Balance:',
????????balanceOf(tokenId_).toString(),
????????'</text>',
????????'?<textxml:space="preserve"text-anchor="start"font-family="NotoSansJP"font-size="24"id="svg_3"y="270"x="200"stroke-width="0"stroke="#000"fill="#ffffff">Slot:',
????????slotOf(tokenId_).toString(),
????????'</text>',
????????'?<textxml:space="preserve"text-anchor="start"font-family="NotoSansJP"font-size="24"id="svg_4"y="160"x="150"stroke-width="0"stroke="#000"fill="#ffffff">ERC3525GETTINGSTARTED</text>',
????????'</g></svg>'
??????)
????);
??}
这将生成一张黑色背景的SVG图像,显示如下:
注意,其中Slot、TokenId和Balance的数值都是直接从ERC-3525通证的当前状态中提取的。
8.部署到本地节点
Hardhat框架自带一个以太坊本地节点的实现,特别针对开发过程中的需求做了不少优化。我们推荐在开发调试过程中将合约部署到这个节点上。
在deploy目录修改deploy.ts如以下内容:
import{ethers}from"hardhat";
asyncfunctionmain(){
?constGettingStarted=awaitethers.getContractFactory("ERC3525GettingStarted");
?constgettingStarted=awaitGettingStarted.deploy();
?gettingStarted.deployed();
?console.log(`GettingStarteddeployedto${gettingStarted.address}`);
}
//Werecommendthispatterntobeabletouseasync/awaiteverywhere
//andproperlyhandleerrors.
main().catch((error)=>{
?console.error(error);
?process.exitCode=1;
});
打开一个新的Terminal,运行hardhat内建节点
npxhardhatnode
运行结果如下:
在项目主目录执行以下命令:
npxhardhatrun--networklocalhostscripts/deploy.ts
执行成功后将看到如下结果。注意红框的地址部分,后面的交互会用到。
智能合约部署之后,可以通过hardhatconsole命令与之进行交互,这是Hardhat节点的一个重要优势,能够大大简化测试和调试阶段的工作。输入以下命令:
npxhardhatconsole--networklocalhost
交互指令及结果如下:
~/Sources/erc3525-getting-started$npxhardhatconsole--networklocalhost
WelcometoNode.jsv16.18.1.
Type".help"formoreinformation.
>constGettingStarted=awaitethers.getContractFactory("ERC3525GettingStarted")
undefined
>constgettingStarted=awaitGettingStarted.attach('<此处替换成你部署的地址,也就是上一图的红框处的地址>')
undefined
>const=awaitethers.getSigners()
undefined
>awaitgettingStarted.mint(otherAccount.address,3525,10000)
{
?hash:'0x94d428b32da7e66e8f0e2d48a37ddb9072dca54013130d95779495e1e443df2c',
...
}
读者可以自行输入一些TypeScript代码来尝试与智能合约进行交互。
9.在Sepolia测试网络上部署
在开发环境下测试和调试完毕之后,就需要部署到测试链上了。测试链提供了基本等同于主链的运行环境,但在上面进行测试和调试无需缴纳高昂的gas费用。另一方面,有些智能合约的功能必须在测试链上才能运行,比如与Oracle的交互,在开发用的虚拟节点上是不支持的。我们这个案例非常简单,用不到Oracle,但是作为一个原则,一个智能合约在上主链之前,一定是要在测试链上运行测试无误才可以。
以太坊已经于2022年9月15日升级到POS,因此之前几个流行的测试链,如Ropsten,Rinkeby,Kovan等已经被废弃。现在主要的两个测试链是Goerli和Sepolia。其中Goerli历史较长,完全开放,比较适合于测试复杂的智能合约,而Sepolia较新,由一组确定的验证者节点组成,不能随意加入,是当前进行DApp开发测试的首选测试链。在这个例子中,我们选择Sepolia测试链。
为了部署在Sepolia测试链,读者需要通过https://www.infura.io/申请infuraAPIKEY。我们假定读者已经完成这项工作,下面直接介绍部署的过程。
修改hardhat.config.ts如下:
import{HardhatUserConfig}from"hardhat/config";
import"`,
???accounts:
????process.env.PRIVATE_KEY!==undefined?:,
??},
?}
};
exportdefaultconfig;
然后在Terminal命令行环境中执行以下命令,设置?infuraapikey和privatekey:
exportINFURA_KEY=<YOUR_INFURA_KEY>;exportPRIVATE_KEY=<YOUR_PRIVATE_KEY>;
请注意,将<YOUR_INFURA_KEY>替换成你申请的infuraAPIKEY,将<YOUR_PRIVATE_KEY>替换成私钥。强烈建议测试网和主网的私钥隔离,不要使用已有的主网私钥。
在Sepolia测试网中进行测试需要准备一些测试币,即SepoliaFaucETH。读者可以到https://faucet.sepolia.dev/去申领一些FaucETH以供测试之用。
这些准备工作做好之后,就可以执行脚本进行部署了:
npxhardhatrun--networksepoliascripts/deploy.ts
执行成功后,结果如下。请注意红框中的地址,我们将在下一步中使用到。
10.铸造ERC3525GettingStarted通证
下面我们来铸造一个ERC3525GettingStarted通证。我们采用的方法是使用TypeScript调用合约功能进行通证铸造,这与在Web3DApp开发中的模式是一致的。
首先在scripts目录下新建文件mint.ts,代码如下:
import{ethers}from"hardhat";
asyncfunctionmain(){
?const=awaitethers.getSigners();
?constGettingStarted=awaitethers.getContractFactory("ERC3525GettingStarted");
?constgettingStarted=awaitGettingStarted.attach('<部署合约地址>');
?consttx=awaitgettingStarted.mint(owner.address,3525,20220905);
?awaittx.wait();
?consturi=awaitgettingStarted.tokenURI(1);
?console.log(uri);
}
//Werecommendthispatterntobeabletouseasync/awaiteverywhere
//andproperlyhandleerrors.
main().catch((error)=>{
?console.error(error);
?process.exitCode=1;
});
请注意,将代码中<部署合约地址>替换成上一节红框中的地址。
最后,执行以下命令:
npxhardhatrun--networksepoliascripts/mint.ts
这样,我们就成功的铸造了一张ERC3525GettingStarted通证。
怎么确认这一点呢?可以到SepoliaEtherscan(https://sepolia.etherscan.io/)上去查看铸造出来的token。在浏览器地址栏里输入:
https://sepolia.etherscan.io/address/<部署合约地址>
请注意,将<部署合约地址>替换成上一节红框中的地址。
恭喜你!如果一切顺利,你就成功的开发和部署第一个ERC-3525通证了,可以对它进行各种新的操作了,比如拆分、合并、在两个通证之间转账,等等,赶快尝试一下吧!
本文完整的示例代码参见GitHub。
进阶学习
本教程对于ERC-3525半匀质化通证应用开发的过程进行了简明扼要的阐述。读者可以由此出发,开发具有丰富功能和高级外观的SFT。当然,如果想要深入学习ERC-3525的知识和开发技术,这只是一个起点,我们推荐您从以下几个方面入手深入学习:
阅读ERC-3525白皮书研究ERC-3525参考实现研究SFTLabs官方提供的Showroom案例研究ERC-3525技术专家开发的以太币现金钞案例CryptoNotes?(https://cryptonotes.fun/)我们也将继续发表一系列文章和教程来帮助开发者掌握ERC-3525技术。
责任编辑:Kate
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。