智能合约安全

2024年07月08日更新 458 人订阅
专栏简介 DeFi安全之杠杆挖矿 SharkTeam系列课程—NFT&GameFi开发与安全 NFT和GameFi概念介绍 ERC20/ERC721/ERC1155概念与协议 闪电贷和重入攻击:Grim Finance被黑事件分析 重入攻击:Uniswap V3流动性协议Visor Finance被黑事件分析 领航Web3安全,让数字生活更安全更美好:SharkTeam线上AMA实录 闪电贷攻击:Sashimi Swap被黑事件分析 ERC20相关业务的合约开发与合约安全 权限问题:Crosswise 被黑事件分析 细节决定成败:QBridge被黑事件分析 损失3.26亿,跨链协议再暴雷:Wormhole被黑事件分析 参数校验不严谨:Superfluid被黑事件分析 ERC721/ERC1155合约开发与合约安全 闪电贷+提案攻击-Beanstalk Farms攻击原理及资金流向分析 监守自盗?Titano.Finance被黑事件分析 AscendEX黑客攻击事件资金流向分析 NFT交易平台安全风险频发--OpenSea & X2Y2安全事件分析 SharkTeam系列课程—NFT 应用场景分析 SharkTeam发布2022年Q1智能合约安全态势感知季报 ChainAegis链上分析:以太坊合并后的中心化风险 大意失荆州-Akutar合约漏洞导致34M美元资金永久被锁 SharkTeam:十大智能合约安全威胁之回退攻击 闪电贷&重入攻击:Hundred与Agave被黑事件分析 从APE空投漏洞谈起,NFT安全情况究竟如何? 千里之堤,溃于蚁穴—跨链协议Nomad被黑事件分析 SharkTeam服务全线升级,重磅推出ChainAegis链上风险分析平台,全面保障Web3生态安全 ChainAegis:从链上数据看,FTX会崩盘吗? NFT合约同样也有重入风险:Revest Finance被黑事件分析 操纵预言机+提案攻击—Fortress Loans被黑事件分析 去年519,今年510—从链上分析的角度看,LUNA会不会真的陷入死亡螺旋? 算法稳定币UST崩盘—是完美风暴还是金融围猎? 6.2亿,再破记录:Ronin Bridge攻击事件技术分析与资金流向分析 周天王的愚人节-NFT精准钓鱼事件技术分析与资金流向分析 【深度】从链上分析和金融安全角度,看stETH的囚徒困境和Celsius挤兑事件 NFT流动性协议的安全困局—NFT借贷协议XCarnival被黑事件分析 NFT流动性市场安全问题频发—NFT交易平台Quixotic被黑事件分析 【深度】OpenSea 新协议 Seaport源码解析 重入攻击+闪电贷—NFT金融协议Omni被黑事件分析 SharkTeam发布2022年第二季度Web3安全态势感知报告 DeFi安全之DEX与AMMs SharkTeam完成Flow生态NFT市场MatrixMarket的安全审计 闪电贷技术详解-Part 1 闪电贷技术详解-Part 2 闪电贷技术详解-Part 3 SharkTeam系列课程:什么是DeFi借贷 DeFi安全之抵押借贷 从链上分析角度看Tornado Cash被制裁事件 Defi安全之借贷杠杆 链上数据角度,看DeFi隐私赛道的现状和未来 火眼金睛,教你如何识别Rug Pull项目 SharkTeam:十大智能合约安全威胁之重入攻击 SharkTeam:十大智能合约安全威胁之操纵预言机 SharkTeam:十大智能合约安全威胁之逻辑校验漏洞 SharkTeam:十大智能合约安全威胁之权限漏洞 SharkTeam:8月Web3安全报告 SharkTeam:十大智能合约安全威胁之合约升级漏洞 警惕以太坊合并后的重放攻击:Omni跨链桥被攻击事件分析 SharkTeam:十大智能合约安全威胁之函数恶意初始化 波卡“以太坊"Moonbeam的技术创新之路 左手以太坊、右手跨链-Moonbeam的创新与突破 批准+校验漏洞-TransitSwap安全事件分析 ChainAegis:BTC和ETH第三季度链上数据解读 默克尔树漏洞成因和链上资金追踪-BNBChain跨链桥攻击事件分析 SharkTeam:Move合约开发与合约安全 Moonbeam的多链架构 高保真还原BNBChain跨链攻击实现原理-攻击者选择高度为110217401的区块到底有什么讲究? SharkTeam:十大智能合约安全威胁之三明治攻击 香港要成为国际虚拟资产中心,链上安全是关键 SharkTeam:十大智能合约安全威胁之提案攻击 ChainAegis:FTX资金流向最新分析,风险大,请尽快提款 SharkTeam:十大智能合约安全威胁之重放攻击 Move语言安全性分析及合约审计要点 之权限漏洞、重入攻击 ChainAegis:Top20 中心化交易所资金储备链上分析-Part 1 区块链安全 Move语言安全性分析及合约审计要点 之逻辑校验漏洞 ChainAegis:Top20 中心化交易所资金储备链上分析-Part 2 ChainAegis:Top20 中心化交易所资金储备链上分析-Part 3 Move语言安全性分析及合约审计要点 之函数恶意初始化 链上数据分析:CeFi频繁暴雷后,DEX会成为主流吗? Move语言安全性分析及合约审计要点之回退攻击 SharkTeam:11月Web3安全报告 SharkTeam与NFMS达成合作,提供Move合约审计服务 Move语言安全性分析及合约审计要点之提案攻击 ChainAegis分析报告:Dogecoin排名前10的市值从何而来? SharkTeam完成APTOS生态项目NFMS的合约审计 ArWiki调研报告 Move语言安全性分析及合约审计要点之合约升级漏洞 Verto调研报告 在深熊中艰难前行,DeFi & CeFi 2022年度分析报告 SharkTeam:2022年度Web3安全报告 ChainAegis:2022年度NFT&GameFi分析报告 Move语言安全性分析及合约审计要点之操纵预言机 加密货币反洗钱(AML)分析 SharkTeam:Move语言安全性分析及合约审计要点 之三明治攻击 ChainAegis:BUSD链上数据分析报告 闪电贷攻击+业务逻辑漏洞:Platypus Finance事件分析 SharkTeam:Move语言安全性分析及合约审计要点之重放攻击 加密货币钓鱼团伙Monkey Drainer链上行为分析 权限漏洞+价格操纵:SwapX被攻击事件分析 ChainAegis:Blur链上数据分析报告 ChainAegis:数读Silvergate & SVB崩盘事件 业务逻辑漏洞+闪电贷攻击:Euler Finance被攻击事件分析 ChainAegis:稳定币协议Liquity链上分析报告 ChainAegis:GMX链上分析报告 SharkTeam与GoPlus Security达成战略合作,共同守护Web3世界安全 香港之夜,Dao的盛会 SharkTeam:2023年第一季度Web3安全报告 Talk with us,公链、DeFi等Web3时代的创新发展机遇有哪些? 香港Web3嘉年华“Web3与安全”主题论坛议程揭秘 2023香港Web3嘉年华,SharkTeam展台指引 权限校验漏洞:SushiSwap被攻击事件分析 香港会议期间,SharkTeam发布“链上安全分析研究报告” 安全是发展Web3的必要条件-SharkTeam受邀香港Web3嘉年华 ChainAegis:LSD赛道链上分析报告 Sui 与 Aptos 技术实现对比 ChainAegis:去中心化保险赛道及风险分析 ChainAegis:Pancakeswap V2V3链上数据分析 ChainAegis:AAVE V2/V3链上数据分析 ChainAegis:Gains Network链上数据分析 逻辑漏洞:DEUS被攻击事件分析 ChainAegis:BRC-20链上数据分析 ChainAegis:Blend链上数据分析 SharkTeam:Tornado.Cash提案攻击原理分析 SharkTeam:Sui主网链上数据分析 SharkTeam:Jimbos protocol闪电贷攻击原理分析 SharkTeam:RWA赛道链上数据分析 SharkTeam:Zksync Era链上数据分析 SharkTeam:Atomic Wallet攻击原理和洗钱模式分析 链安全 Sui主网上线满月,链上持币者数据分析 SharkTeam:Atlantis提案攻击原理分析 SharkTeam:HashFlow攻击事件原理分析 SharkTeam:2023年第二季度Web3安全报告 SharkTeam与Move Accelerator达成合作,Let’s Move! SharkTeam:Themis protocol闪电贷价格操纵攻击分析 SharkTeam:4月28日攻击者就已实施攻击-PolyNetwork攻击原理和资产转移分析 SharkTeam:AzukiDAO攻击事件分析 SharkTeam:BNO攻击事件原理分析 SharkTeam:Vyper漏洞导致Curve和JPEG'd等项目被攻击原理分析 SharkTeam:UniswapV4 Hook最佳安全实践 SharkTeam:UniswapX 源码分析 SharkTeam:Worldcoin运营数据及业务安全分析 SharkTeam与TOKEN2049正式达成合作伙伴关系 SharkTeam:Exactly Protocol攻击事件原理分析 SharkTeam:Rugpull工厂黑色产业链分析 SharkTeam开启9月双城记 SharkTeam上海区块链全球峰会展台指引 SharkTeam:Web3安全实践与创新 KYT/AML:Web3合规展业的必要条件 SharkTeam:典型钓鱼攻击链上资产转移分析 SharkTeam:起底朝鲜APT组织Lazarus Group,攻击手法及洗钱模式 SharkTeam:2023年第三季度Web3安全报告 SharkTeam:BH闪电贷攻击原理分析 SharkTeam:Platypus Finance攻击事件原理分析 SharkTeam:Onyx Protocol攻击事件原理分析 SharkTeam:Raft攻击事件原理分析 从链上分析角度看FTX破产清算过程,美国加密货币监管与风险处置能力究竟如何 SharkTeam:KyberSwap攻击事件原理分析 SharkTeam:ERC2771\&Multicall任意地址欺骗漏洞原理分析 SharkTeam:OKX DEX攻击事件分析及链上资产追踪 SharkTeam:从链上数据看稳定币的安全与监管 SharkTeam:2023年加密货币犯罪分析报告 SharkTeam:MIM_SPELL被攻击事件原理分析 SharkTeam:合约精度计算漏洞与安全建议 SharkTeam:Woo Finance被攻击事件分析 SharkTeam:Prisma Finance被攻击事件分析 SharkTeam:2024年第一季度Web3安全报告 SharkTeam:Hedgey Finance被攻击事件分析 SharkTeam:Sonne Finance攻击事件分析 SharkTeam:Web3常见钓鱼方式分析与安全防范建议 SharkTeam:UwU Lend攻击事件分析 SharkTeam:美国众议院FIT21法案解读 SharkTeam:2024年上半年度Web3安全报告

ERC20/ERC721/ERC1155概念与协议

  • SharkTeam
  • 发布于 2022-05-27 22:11
  • 阅读 13490

SharkTeam合约安全系列课程之NFT&GameFi开发与安全。第二课,让我们一起来学习ERC20、ERC721、ERC1155等关键协议。

SharkTeam合约安全系列课程之NFT&GameFi开发与安全。第二课,让我们一起来学习ERC20、ERC721、ERC1155等关键协议。

深入理解以太坊上代币标准的设计,有助于确保正确的进行智能合约开发并确保安全,这也是本课程的主要目标。以下是以太坊上最受欢迎的一些代币标准:

  • ERC20 :同质化(可互换)代币的标准接口,比如投票代币、质押代币或虚拟货币。
  • ERC721 :非同质化代币的标准接口,比如艺术作品或歌曲的契约。
  • ERC777 :ERC777使人们能够通过代币上创建额外的功能,例如用于改善交易私密性的混合合约,或是在您不慎丢失私钥时的紧急恢复功能。
  • ERC1155 :ERC1155允许更有效的交易和打包交易,从而节省燃料成本。 此代币标准允许创建实用代币(例如BNB或BAT)和加密朋克之类的非同质化代币。

一、ERC20协议

ERC20提供了一个同质化代币(Fungible Token, FT)的标准,换句话说,每个代币与另一个代币(在类型和价值上)完全相同。例如,一个ERC20代币就像以太币一样,意味着一个代币会并永远会与其他代币一样。

ERC20是由Fabian Vogelsteller于2015年11月在EIP20提案中提出的。这是一个能实现智能合约中代币的应用程序接口标准。

EIP20代币标准

EIP20提案是由Fabian Vogelsteller和Vitalik Buterin在2015年11月创建的代币标准,定义了代币合约的标准接口,提供了转移代币的基本功能,并允许代币获得批准,以方便其他链上的第三方使用。此外,该标准接口允许以太坊上定义的任何代币被其他应用程序(钱包、去中心化交易所等)重用。

ERC20功能

ERC20 的功能包括但不限于以下几点:

  • 转账:将代币从一个帐户转到另一个帐户
  • 查询余额:获取帐户的当前代币余额
  • 查询总量:获取网络上可用代币的总供应量
  • 代币授权:批准一个帐户中一定的代币金额由第三方帐户使用

函数

image.png

注意:

(1)合约使用的Solidity语言版本必须是0.4.17或以上;

(2)对于返回值success,调用者必须处理success为false的情况,不能假设success永远为true而忽略success为false的情况。

1. name

1653659406_6290d70ec7e56dca687d2.png!small?1653659440725

返回代币合约中定义的代币名称,比如”MyToken”。

该函数读取代币合约中定义的代币名称。这里,定义代币名称可以提高代币合约的可用性,但不是代币合约必须定义的属性,但标准的ERC20合约都会定义。

2. symbol

1653659424_6290d720ae105e288c20c.png!small?1653659458562

返回代币合约中定义的代币符号,比如”HIX”。

该函数读取代币合约中定义的代币符号。这里,定义代币符号可以提高代币合约的可用性,但不是代币合约必须定义的属性,但标准的ERC20合约都会定义。

3. decimals

1653659438_6290d72e9161fc3441f09.png!small?1653659472425

返回代币合约中定义的代币的精度,比如18,表示代币的余额除以10^18后才是真正的代币数量。类似于以太的单位换算,余额10^18 Wei表示以太数量为1=10^18/10^18。

该函数读取代币合约中定义的代币精度。这里,定义代币精度可以提高代币合约的可用性,但不是代币合约必须定义的属性,但标准的ERC20合约都会定义。

4. totalSupply

1653659455_6290d73f37a11ae7c7f71.png!small?1653659489270

返回代币的总供应量。

5. balanceOf

image.png

返回地址为_owner的账户的代币余额。

6. transfer

image.png

将调用者账户中_value数量的代币转移到地址_to,并且必须触发Transfer事件。如果调用者的账户余额没有足够的代币可以支付_value数量的代币时,该函数应该抛出异常并回滚。

注意:0值作为_value值传入到函数必须被视为正常的函数执行并触发Transfer事件。

7. transferFrom

image.png

将_value数量的代币从地址_from转移到地址_to,并且必须触发Transfer事件。

transferFrom方法用于提款流程,允许合约代表代币所有者账户转移代币。 例如,这可用于允许合约代表代币所有者转移代币和/或以次级货币(sub-currency)的形式收取费用。若函数调用者没有得到_from账户的授权,该函数则会抛出异常并回滚。

注意:0值作为_value值传入到函数必须被视为正常的函数执行并触发Transfer事件。

8. approve

image.png

该函数的调用者账户地址将_value数量的代币授权给_spender,或者更新授权的代币数量,即_spender可以多次提取调用者账户地址的代币,总数量不超过_value,每次提取的代币数量也不能超过调用者账户地址的代币余额,同时提取后会更新_value的值。如果在提取过程中,提取的代币数量超过了代币余额不足,该函数会抛出异常并回滚。

9. allowance

image.png

返回账户地址_spender还可以从账户地址_owner中提取的代币数量。

事件

image.png

1. Transfer

image.png

Transfer事件必须在代币转移时触发,包括转移的代币数量为0的情况。

代币合约在铸造代币时应该触发Transfer事件,并将_from地址设置为0。此时,也可以自定义并触发Mint事件:

1653659618_6290d7e2cfe57bc290c58.png!small?1653659652703

代币合约在销毁代币时应该触发Transfer事件,并将_to地址设置为0x。此时,也可以自定义并触发Burn事件:

1653659634_6290d7f22ca1f964a4df5.png!small?1653659668038

2. Approval

image.png

必须在任何调用approve函数并执行成功时触发。

二、ERC721协议

ERC721 为 NFT 引入了一个标准,换言之, 这种类型的代币是独一无二的,并且可能与来自同一智能合约的另一代币有不同的价值,也许是因为它的年份、稀有性、甚至是它的观感。

每一个NFT都有一个uint256类型的变量,名为tokenId,所以对于任何ERC721合约,这对值<contract address, tokenId>必须是全局唯一的。dApp可以有一个“转换器”,该转换器输入tokenId,然后输出一些非常有趣的事物的图像,比如僵尸、武器、技能或非常可爱的猫咪等。

ERC721是由William Entriken、Dieter Shirley、Jacob Evans、Nastassia Sachs于2018年1月在EIP721中提出的一个在智能合约中实现代币API的非同质化代币标准。

BIP721代币标准

BIP721提案描述了智能合约中实现NFT的标准API。 标准提供了跟踪和转移NFT的基本功能。该提案考虑了个人拥有和交易NFT的场景,以及委托给第三方(如:代理人/钱包/拍卖人,称为“操作员”)的情况。

NFT可以代表对数字或物理资产的所有权。我们考虑了资产的多样性,并且我们知道您会想要代表更多:

  • 实体财产,如:房屋,独特的艺术品;
  • 虚拟收藏品,如:小猫,收藏卡的独特图片;
  • “负”资产,如:贷款等。

总的来说,所有房屋都是不同的,没有两只小猫是一样的。NFT是可区分的,必须分别跟踪每个所有者。

ERC721功能

ERC721的功能包括但不限于以下几点:

  • 转账:将代币从一个帐户转移到另一个帐户;
  • 查询余额:获取帐户的当前代币余额;
  • 查询所有者:获取代币的所有者;
  • 查询总量:获取整个网络的可用代币总供应量;
  • 代币授权:批准帐户中一定数量的代币可以被第三方帐户转移。

函数

image.png

以上定义的函数都是外部函数,函数只能进行外部调用。

1. balanceOf

1653659698_6290d832e2927fff3a687.png!small?1653659732738

查询余额,返回地址_owner拥有的合约定义的NFT的数量,若没有,则返回0。

2. ownerOf

1653659713_6290d8412004aa6521823.png!small?1653659746952

查询所有者地址,返回tokenId为参数_tokenId的NFT的所有者地址。

3. safeTransferFrom

image.png

安全地转移NFT所有权并发送数据,即将tokenId为参数_tokenId的NFT的所有权由地址_from转移给地址_to,并将额外的数据data发送给地址_to,并触发Transfer事件。参数data没有格式要求。若地址_to是合约地址,data一般包含函数签名值(methodId)以及函数参数值,当data发送给_to时,会调用合约_to中签名值对应的函数或者回调函数。

函数能够执行,必需满足以下条件:

  • 参数_from是_tokenId对应的NFT的所有者
  • 调用者sender有权转移_tokenId对应NFT的所有权,即:msg.sender是_tokenId对应NFT的所有者或者得到了其授权。
  • 参数_to不是零地址

若不满足条件,函数将抛出异常并回滚。

另外,该函数使用了payable修饰符,因此可以接收以太坊原生代币(以太币)。

4. safeTransferFrom

image.png

安全地转移NFT所有权,即将tokenId为参数_tokenId的NFT的所有权由地址_from转移给地址_to,并触发Transfer事件。

调用该函数等价于调用上面的safeTransferFrom中data参数是””的情况,即:

1653659755_6290d86be0b23e73519b4.png!small?1653659789759

5. transferFrom

image.png

转移NFT所有权,即将tokenId为参数_tokenId的NFT的所有权由地址_from转移给地址_to,并触发Transfer事件。函数能够执行,必需满足以下条件:

  • 参数_from是_tokenId对应的NFT的所有者
  • 调用者sender有权转移_tokenId对应NFT的所有权,即:msg.sender是_tokenId对应NFT的所有者或者得到了其授权。
  • 参数_to不是零地址

若不满足条件,函数将抛出异常并回滚。

6. approve

image.png

将tokenId为参数_tokenId的NFT授权给地址_approved,或者更新授权地址为_approved,并且触发Approve事件。函数能够执行,必需满足以下条件:

  • 调用者sender有权转移_tokenId对应NFT的所有权,即:msg.sender是_tokenId对应NFT的所有者或者得到了其授权。

若不满足条件,函数将抛出异常并回滚。

7. setApprovalForAll

image.png

将调用者msg.sender的所有NFT资产授权给_operator地址来管理,或者取消授权,并且触发ApprovalForAll事件。

参数_approved是true代表授权;参数_approved是false代表取消授权。

8. getApproved

image.png

查询单个NFT的授权地址。若_tokenId不是一个有效的NFT的tokenId,该函数会抛出异常并回滚。

9. isApprovedForAll

image.png

查询地址_owner的所有NFT是否授权给了另一个地址_operator来管理。若已授权,则返回true;否则,返回false。

事件

image.png

1. Transfer

image.png

该事件在NFT转移所有权完成时触发。

代币合约在铸造NFT时应该触发Transfer事件,并将_from地址设置为0。此时,也可以自定义并触发Mint事件:

1653659895_6290d8f7a4c15e325081c.png!small?1653659929534

代币合约在销毁NFT时应该触发Transfer事件,并将_to地址设置为0x。此时,也可以自定义并触发Burn事件:

1653659910_6290d9062a1183cd8ba62.png!small?1653659943996

2. Approval

当将_owner地址的单个NFT(其tokenId为参数_tokenId)授权给_approved地址时,在授权完成后触发Approval事件。

image.png

3. ApprovalForAll

image.png

当将_owner地址的所有NFT授权给_operator地址或者取消该授权时,触发ApprovalForAll事件。

三、ERC1155协议

ERC1155协议是由Witek Radomski, Andrew Cooke等于2018年6月在EIP1155提案中提出的用于多种代币管理的合约标准接口。单个部署的合约可以包括同质化代币、非同质化代币或其他配置(如半同质化代币)的任何组合。

多代币标准的目的是创建一个智能合约接口,可以代表和控制任何数量的同质化和非同质化代币类型。这样一来,ERC-1155代币就具有与ERC20和ERC721代币相同的功能,甚至可以同时使用这两者的功能。而最重要的是,它能改善这两种标准的功能,使其更有效率,并纠正ERC20和ERC721标准上明显的实施错误。

BIP1155

BIP1155提案概述了一个标准的智能合约接口,可以代表任意数量的同质化代币和非同质化代币类型。ERC20等现有标准要求为每种代币类型部署单独的合约。ERC721标准的代币ID是一个单一的非同质化索引,每组非同质化代币都会被部署为具有统一设置的独立的合约。相比之下,ERC1155多代币标准允许每个代币ID表示一个新的可配置代币类型,它可以有自己的元数据、供应量以及其他属性。

每个函数的参数集合中都会包含_id参数,表示交易中的一种特定的代币或代币类型。

ERC1155功能

ERC1155的功能包括但不限于以下几点:

  • 批量传输:通过一次合约调用传输多种资产;
  • 批量余额:在一次调用中获取多个资产的余额;
  • 批量授权:授权同一地址的所有代币;
  • Hook:接收代币的钩子函数;
  • 支持非同质化代币:如果供应量仅为 1,将其作为非同质化代币(NFT)处理;
  • 安全转账规则:安全转账规则集。重要规则如下:
  1. 调用者必须获得批准才能从 _from 的账户地址消费代币,或者调用者账户地址必须与 _from 的账户地址相同。
  2. 在以下情况下,转账调用将回滚:

(1)_to地址为0;

(2)_ids的长度与_values的长度不同;

(3)_ids中代币持有者的任何余额低于发送给接收者的相应_value金额;

(4)出现任何其他错误。

函数

批量传输

image.png

  1. transferFrom!image.png

ERC20代币转移,从地址from将value数量的代币转移到地址to,与ERC20协议中的transferFrom功能相同。

  1. safeBatchTransferFrom!image.png

ERC1155代币批量转移,包括同质化代币以及非同质化代币。与ERC20与ERC721相比,ERC1155中唯一的区别是将数值作为数组参数进行传递,此外还会传递数组 id。例如,给出ids=[3, 6, 13]和values=[100, 200, 5],传输结果如下:

  • 将id=3的100个代币从地址_from传输到地址_to;
  • 将id=6的200个代币从地址_from传输到地址_to;
  • 将id=13的5个代币从地址_from转移到地址_to。

ERC1155中只有transferFrom,没有transfer。要想像常规的transfer一样使用它,只需将"from"地址设为调用该函数的地址。

批量余额

image.png

  1. balanceOf1653660020_6290d9745731d5e28836e.png!small?1653660054232

查询owner地址的余额,与ERC20协议中的balanceOf功能相同。

  1. balanceOfBatch

image.png

账户余额批量查询,在单次调用中获取多个余额。参数中传递所有者账户数组和代币的id数组。例如,对于给出的_ids=[3, 6, 13]和_owners=[0xbeef..., 0x1337..., 0x1111...],返回值将为:

image.png

批量授权

image.png

  1. setApprovalForAll

image.png

设置操作帐户_operator为已授权账户或取消授权。授权过程与ERC20略有不同。这里不是授权特定金额,而是类似于ERC721协议中的授权,通过 setApprovalForAll 函数,对操作账户进行完全的授权或取消授权。

  1. isApprovedForAll

image.png

查询当前的审批状态,即_owner是否对_operator进行了授权。结果为true代表全部授权;结果为false代表未授权。 不能定义要授权代币的数量,甚至代币类型。

接收钩子

image.png

ERC1155只支持智能合约的接收钩子函数。钩子函数必须返回一个事先预定义的4字节值,这个值被指定为:

image.png

当接收合约返回这一值时,意味着合约知道如何处理ERC1155代币并接受转账。

事件

image.png

1. TransferSingle

image.png

TransferSingle事件在代币转移成功时触发,包括转移的代币数量为0的情况。另外,代币铸造和销毁时也可以触发TransferSingle事件。与ERC20协议中的Transfer事件相同。

2. TransferBatch

image.png

TransferBatch事件在代币批量转移成功时触发,包括转移的代币数量为0的情况。另外,代币批量铸造和销毁时也需要触发TransferBatch事件。

3. ApprovalForAll

image.png

当将_owner地址的所有代币全部授权给_operator地址或者取消该授权时,触发ApprovalForAll事件。

4. URI

1653660219_6290da3b91fe1139b47c3.png!small?1653660253544

当一个代币ID的URI更新成功时触发URI事件。

四、其他相关代币协议

ERC777协议

ERC777协议是一个易于交易的代币标准,可改进现有的ERC20 标准。与ERC20相比,ERC777提供了以下改进:

  1. 钩子

钩子是智能合约代码中描述的一个函数。钩子将会在代币通过合约发送或者接收时调用。这将允许智能合约对进出的代币做出互动。

  1. 小数位数

该标准还解决了在ERC20中造成的decimals的混乱。这种清晰度提升了开发者体验。

  1. 向后兼容ERC20

ERC777合约可以与ERC20合约进行互动。

更多内容,请见EIP777

ERC165协议

ERC165协议创建了一个标准方法来发布和检测智能合约实现的接口。更多内容详见EIP165

关于我们: SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括威胁建模、智能合约审计、应急响应等在内的综合服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。

Telegram:https://t.me/sharkteamorg

Twitter:https://twitter.com/sharkteamorg

Reddit:https://www.reddit.com/r/SharkTeam

更多区块链安全咨询与分析,点击下方链接查看

D查查|链上风险核查 https://m.chainaegis.com

  • 学分: 50
  • 分类: NFT
  • 标签: NFT 
点赞 0
收藏 5
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论