这篇文章,让你了解ERC-1155 多代币标准协议

2023-11-14

ERC1155 介绍

用于多种代币管理的合约标准接口。 单个部署的合约可以包括同质化代币、非同质化代币或其他配置(如半同质化代币)的任何组合。

多代币标准

ERC1155 的显着特点是它使用单个智能合约一次代表多个代币。这就是为什么它的balanceOf功能不同于 ERC20 和 ERC777 的原因:它有一个额外的id参数,用于您要查询余额的代币的标识符。

这类似于 ERC721 做事的方式,但在该标准中,代币id没有平衡的概念:每个代币都是不可替代的,存在或不存在。ERC721balanceOf函数是指一个账户有多少不同的代币,而不是每个有多少。另一方面,在 ERC1155 账户中,每个代币都有不同的余额id,不可替代的代币是通过简单地铸造其中一个来实现的。

这种方法可以为需要多个代币的项目节省大量气体。无需为每种代币类型部署新合约,单个 ERC1155 代币合约可以保存整个系统状态,从而降低部署成本和复杂性。

前提条件

为了更好地理解后面的内容,需要首先了解以下三方面知识:

代币标准:

以下是以太坊上最受欢迎的一些代币标准:

  • ERC20:可替代资产最广泛使用的代币标准,尽管受到其简单性的限制。

  • ERC721:不可替代代币的实际解决方案,通常用于收藏品和游戏。

  • ERC777:更丰富的可替代代币标准,支持新的用例并建立在过去的学习基础上。向后兼容 ERC20。

  • ERC1155:一种新的多代币标准,允许单个合约代表多个可替代和不可替代的代币,以及批量操作以提高气体效率。

ERC-20

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

详情可了解:https://eips.ethereum.org/EIPS/eip-20

ERC-721

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

是的。 所有 NFTs 都有一个 uint256 变量,名为 tokenId,所以对于任何 ERC-721 合约,这对值contract address, tokenId 必须是全局唯一的。 也就是说,dApp 可以有一个“转换器”,该转换器使用 tokenId 输入和输出一些非常有趣的事物的图像, 例如僵尸、武器、技能或非常可爱的猫咪!

详情可了解:https://eips.ethereum.org/EIPS/eip-721

构建 ERC1155 代币合约

我们将使用 ERC1155 来跟踪我们游戏中的多个项目,每个项目都有自己独特的属性。我们将所有项目铸造给合约的部署者,然后我们可以将其转移给玩家。玩家可以自由地保留他们的代币或在他们认为合适的时候与其他人交易,就像他们对区块链上的任何其他资产一样!

为简单起见,我们将在构造函数中铸造所有项目,但您可以在合约中添加铸造功能,以便按需铸造给玩家。

请注意,对于我们的游戏物品,黄金是可替代的代币,而雷神之锤是不可替代的代币,因为我们只铸造了一个。

ERC1155合同包括可选的扩展IERC1155MetadataURI。这就是uri函数的来源:我们使用它来检索元数据 uri。

另请注意,与 ERC20 不同,ERC1155 缺少decimals字段,因为每个令牌都是不同的并且无法分区。

ERC-1155 的功能和特点:

  • 批量传输:通过一次合约调用传输多种资产。
  • 批量余额:在一次调用中获取多个资产的余额。
  • 批量审批:审批同一地址的所有代币。
  • Hook:接收代币的钩子函数。
  • 支持非同质化代币:如果供应量仅为 1,将其作为非同质化代币处理。
  • 安全转账规则:安全转账规则集。

批量传输

批量传输与常规 ERC-20 传输非常相似。 让我们看看常规的 ERC-20 与ERC-1155有什么区别:

// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);

// ERC-1155
function safeBatchTransferFrom(
    address _from,
    address _to,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external;

ERC-1155 中唯一的区别是我们将数值作为数组传递,我们也传递了数组 id。 例如,给出 ids=[3, 6, 13] 和 values=[100, 200, 5],传输结果将是

  1. 将 id 3 的 100 个代币从 _from 传输到 _to。
  2. 将 id 6 的 200 个代币从 _from 传输到 _to。
  3. 将 id 13 的 5 个代币从 _from 转移到 _to。

在 ERC-1155 中,我们只有 transferFrom,没有 transfer。 要像常规的 transfer一样使用它,只需将 “from” 地址设为调用该函数的地址。

例如以下操作:

我们可以将物品转移到玩家账户:

> NFTV2.safeTransferFrom(deployerAddress, playerAddress, 2, 1, "0x0")
> NFTV2.balanceOf(playerAddress, 2)
1
> NFTV2.balanceOf(deployerAddress, 2)
0

我们也可以批量转账到玩家账户,获取批量余额:

> NFTV2.safeBatchTransferFrom(deployerAddress, playerAddress, [0,1,3,4], [50,100,1,1], "0x0")
> NFTV2.balanceOfBatch([playerAddress,playerAddress,playerAddress,playerAddress,playerAddress], [0,1,2,3,4])
[50,100,1,1,1]

批量余额

相应的 ERC-20 balanceOf 调用同样具有支持批处理的相应函数。 同样,使用ERC-20 与 ERC-1155 做一个对比:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);

调用余额查询更简单的是,我们可以在单次调用中获取多个余额。 参数中传递所有者账户数组和代币的 id 数组。

例如,对于给出的 _ids=[3, 6, 13] 和 _owners=[0xbeef…, 0x1337…, 0x1111…],返回值将为:

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

当然,我们也可以查询单个地址及token的余额

> NFTV2.balanceOf(deployerAddress,3)
1000000000

批量审批

// ERC-1155
function setApprovalForAll(
    address _operator,
    bool _approved
) external;

function isApprovedForAll(
    address _owner,
    address _operator
) external view returns (bool);

审批过程与 ERC-20 略有不同。 这里不是批准特定金额,而是通过 setApprovalForall 函数设置操作帐户为已批准或未批准。

查看当前的审批状态可以通过 isApprovedForall 完成。 如你所见,要么全部批准,要么不批准。 不能定义要批准代币的数量,甚至代币类型。

这是考虑到简洁性而故意设计的。 你只能批准一个地址的所有代币。

接收钩子

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

基于 EIP-165 的协议支持,ERC-1155 只支持智能合约的接收钩子函数。 钩子函数必须返回一个事先预定义的 4 字节值,这个值被指定为:

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

当接收合约返回这一值时,意味着合约知道如何处理 ERC-1155 代币并接受转账。 太好了,代币不会再卡在合约中了!

使用时的一个关键区别safeTransferFrom是令牌转移到其他合约可能会恢复并显示以下消息:

ERC1155: transfer to non ERC1155Receiver implementer

这是一件好事!这意味着接收合约尚未将自己注册为了解 ERC1155 协议,因此禁用向其传输以防止代币被永久锁定。例如,Golem 合约目前持有超过 35万个GNT代币,价值数万美元,并且缺乏将它们从那里取出的方法。几乎每个 ERC20 支持的项目都会发生这种情况,通常是由于用户错误。

为了让我们的合约接收 ERC1155 代币,我们可以继承ERC1155Holder为我们处理注册的便利合约。尽管我们需要记住实现功能以允许将代币从我们的合约中转移出来:

支持非同质化代币

当供应量仅为 1 时,代币本质上就是一个非同质化的代币 (NFT)。 按照 ERC-721 的标准,您可以定义一个元数据网址。 客户端可以读取并修改网址,请参阅这里。

安全转账规则

在前面的解释中,我们已经提到过一些安全转账规则。 现在我们来看一下最重要的规则:

  1. 调用者必须获得批准才能从 _from 的账户地址消费代币,或者调用者账户地址必须与 _from 的账户地址相同。
  2. 在以下情况下,转账调用将回退
  • _to 地址为 0;
  • _ids 的长度与 _values 的长度不同;
  • _ids 中代币持有者的任何余额低于发送给接收者的相应 _value 金额。
  • 出现任何其他错误。

注意:包括钩子在内的所有批处理函数也均作为非批处理的版本存在。 这样做是为了提高燃料效率,考虑到只转移一种资产可能仍然是最常用的方式。 简洁起见,我们没有在这里介绍这些非批处理的版本,包括安全转账规则。 名称是相同的,只需移除 ‘Batch’。

参考文档:
ERC-1155 Github 代码库:https://github.com/enjin/erc-1155
ERC-1155 Openzepelin 文档:https://docs.openzeppelin.com/contracts/3.x/erc1155
EIP-1155 多代币标准:https://eips.ethereum.org/EIPS/eip-1155
EIP-1155 以太坊官网文档:https://ethereum.org/zh/developers/docs/standards/tokens/erc-1155/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这篇文章,让你了解ERC-1155 多代币标准协议 的相关文章

  • 区块链之java调用智能合约(二)部署智能合约

    前言 上一节 已经说过 如何的创建一个合约 如何编译合约 然后在java中调用 但是呢 这些还远远不够 那么还差哪些呢 现在就是如何将创建的智能合约部署的对应的共链 私链 测试链中了 需要部署后 才能真正的使用 现在就讲讲如何部署智能合约
  • 区块链底层平台FISCO BCOS的证书机制

    FISCO BCOS是完全开源的联盟区块链底层技术平台 由金融区块链合作联盟 深圳 简称金链盟 成立开源工作组通力打造 开源工作组成员包括博彦科技 华为 深证通 神州数码 四方精创 腾讯 微众银行 亦笔科技和越秀金科等金链盟成员机构 代码仓
  • 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    前往老猿Python博文目录 一 智能合约的定义 通俗来说 智能合约就是一种在计算机系统上 当一定条件满足的情况下可被自动执行的合约 智能合约体现为一段代码及其运行环境 例如银行信用卡的自动还款就是一种典型的智能合约 我们来看看智能合约概念
  • EOS智能合约安全开发终极指南

    EOS智能合约安全终极指南 当世界上最大的ICO EOS于2018年6月推出时 加密社区变得持怀疑态度 并且由于软件错误而被冻结了2天 但快进4个月 EOS今天占了以太网今天所做交易的两倍以上 通过免费和更快速交易的承诺 EOS最顶级的Da
  • Sidetree - 去中心化身份管理协议

    身份 Identity 管理是区块链应用的核心元素 在一个不可信 匿名的分布计算生态中 要实现去中心化身份管理并不是一件容易的事情 Sidetree是一个基于现有区块链平台的第二层 L2s 协议 专门用于去中心化身份管理 微软最新开源的IO
  • 以太坊构建DApps系列教程(一):应用程序规则和区块链设置

    这将是一个如何使用以太坊区块链构建去中心化应用程序DApps的系列教程 第一篇教程重点介绍应用程序的规则和功能以及设置私有区块链 展示在使用或不使用DAO和应用程序的情况下如何构建自己自定义的以太坊代币 我们要构建3件事 自定义代币 使用代
  • Hyperledger:运行“./byfn -m up”时获取“/bin/bash: ./scripts/script.sh: No such file or directory”

    我是超级账本的新手 只是按照以下教程来学习它http hyperledger fabric readthedocs io 我正在尝试使用结构样本中的 first network 构建第一个网络 这 byfn m generate没问题 但打
  • 在同一 Composer Rest 服务器配置中使用两张名片

    我完成了部署到多组织结构网络的教程 并且成功运行 现在我有两张管理卡 alice trade network bob trade network 以及他们发行的两张身份证 卡 jdoe trade network dlowe trade n
  • 我们可以使用 Hyperledger 创建不可替代的代币吗?

    根据 ERC 721 ERC 721 是一个免费 开放的标准 描述了如何构建 以太坊区块链上不可替代或独特的代币 虽然大多数 代币是可替代的 每个代币都与其他代币相同 ERC 721 代币都是独一无二的 是否有关于像超级账本这样的许可区块链
  • 在 Hyperledger Fabric V1.0 的本地开发环境中使用 REST API 支持

    我已经设置了一个HyperLedger Fabric V1 0网络 with 4个组织 每个都有 1 个对等点按照以下步骤操作建立您的第一个网络 我现在有 org1 example com with peer peer0 org1 exam
  • 调用另一个合约中的函数 - Solidity

    我需要使用 Truffle 调用另一个合约中的函数 这是我的合同样本 类别 sol contract Category notice Check if category exists function isCategoryExists ui
  • 如何使用 web3js 发送 ERC20 令牌

    我目前使用的是 0 2x x 版本的 Web3 JavaScript API 我通过在 Solidity 中创建智能合约 在 REMIX IDE 上 来部署自定义 ERC20 代币 我安装了 MetaMask 并进行了测试https wal
  • 什么是区块链和以太坊?它用在哪里?

    我刚刚有机会在基于区块链的以太坊平台上工作 但我不清楚它在哪些场景中使用 在现实生活中使用它 有人可以帮助我了解基于区块链的平台及其现实生活中的用途吗 欢迎来到区块链世界 不要灰心丧气 区块链领域相对较新 很难找到好的教程 我一个月前也开始
  • Solidity、Solc 错误:无法构造包含(嵌套)映射的结构

    我正在使用由 npm 安装的 Solc 版本 0 7 0 当我尝试创建包含映射的结构时 收到错误 无法构造包含 嵌套 映射的结构 请检查代码 SPDX License Identifier MIT pragma solidity 0 7 0
  • Hyperledger Fabric 的性能测试

    在尝试使用 Hyperledger Fabric 实现 IBM 团队在其文章中报告的性能期间Hyperledger Fabric 用于许可区块链的分布式操作系统 https arxiv org abs 1801 10228 我遇到了一些问题
  • web3.js如何搜索所有曾经创建的合约并查看地址

    我是 web3 js 和 Solidity 的新手 我的问题与我们在区块链上搜索的方式有关 如果我们知道合约地址 就很容易搜索特定合约 然而 我们如何使用最初用于创建合约的地址来查找和识别特定类型的合约 例如 我有一个合同 Contract
  • 是否可以在 Solidity 智能合约创建上预留一个地址用于收税?

    我正在使用 Solidity 编程语言 并尝试实现一个合约 即每笔交易都会扣除税费 并且该税费应该转移到正在创建的合约的某个特定地址 那可能吗 是的 这是可能的 所有以太坊代币标准 ERC 20 ERC 721 仅定义一个接口和很少的其他点
  • Solidity有HTTP请求功能吗?

    我正在使用以太坊制作一个项目 在这个项目中 我正在签订一份名为 A 的合同 当我向 A 发送消息时 我希望 A 发出网络请求 Solidity 是否可以使用 http 请求 方法 GET POST 以太坊区块链无法与外界交互 否则它将不再是
  • 在 Corda 中,哪些数据会发送到非验证公证服务?

    这个问题经常出现在对话中 当 Corda 交易被发送到非验证公证服务进行最终确定时 公证服务可以看到并推断出关于世界的什么 在将交易发送给非验证公证人之前 会按如下方式进行过滤 stx buildFilteredTransaction Pr
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error

随机推荐

  • linux 调试技术

    本文讨论了四种调试Linux程序的情况 在第1种情况中 我们使用了两个有内存分配问题的样本程序 使用MEMWATCH和 Yet AnotherMallocDebugger YAMD 工具来调试它们 在第2种情况中 我们使用了Linux中的s
  • 打造自己的专属--VSCode主题(仿HBuilderX绿柔主题配色)

    打造自己的专属 VSCode主题 theme Hx LR主题 介绍 习惯了HBuilderX的主题 再使用VSCode的主题就感觉到有点儿不适应 所以就搜索 修改 然后就心满意足了 哈哈 当然HBuilderX和VSCode并没有好坏之分
  • Lua使用Vector容器

    一 编写vector pkg class vector TOLUA TEMPLATE BIND T string CCSprite 添加我们想要的容器类型 void clear int size const const T operator
  • C/C++中整数加法/减法的溢出问题

    C C 中的整数类型有short int long等 这些整数类型均为有符号整型 即二进制最高位位符号位 相应的无符号整型只需要在各类型前面加上unsigned 如unsigned int等 现在有如下程序 其输出结果会是多少呢 short
  • 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Python实现的推箱子小游戏 名叫Sokoban
  • 基于aidlux的ai模型边缘设备模型部署实战(2.使用opencv图像处理)

    1 介绍 在配置好aidlux相关环境之后 玩转相关有趣ai案例demo后 相信你一定想更快了解更多开发应用 本次学习使用notebook开发环境 手写代码 玩转简单opencv函数调用手机摄像头 实现简单功能 2 调用手机摄像头实时图像处
  • Flink 1.17教程:基本合流操作

    基本合流操作 在实际应用中 我们经常会遇到来源不同的多条流 需要将它们的数据进行联合处理 所以Flink中合流的操作会更加普遍 对应的API也更加丰富 联合 Union 最简单的合流操作 就是直接将多条流合在一起 叫作流的 联合 union
  • 树莓派4学习记录(3)-安装tensorflow

    树莓派4学习记录 3 1 安装tensorflow 1 1 获取tensorflow安装文件 1 2 安装tensorflow 2 测试tensorflow 1 安装tensorflow 这里可以参考这个 https blog csdn n
  • sequelize操作数据库-优雅时间格式化

    sequelize操作数据库 优雅时间格式化 sequelize使用版本6
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章 1 概述 文献来源 本文提出了一类非线性受控
  • 指针初始化与释放问题

    int p free p 操作释放p指向的空间 但是p的值随机 会产生释放未知区域的问题 释放的不是p的空间 而是p指向的空间 p nullptr free P p nullptr 释放后应让p为空 防止再次释放已经释放的空间
  • 测试过程中印象最深刻的bug

    我就想到在我刚入行不久的时候有一个BUG 当时我们做的是一个CRM客户管理系统 里边有个客户列表 当时按照测试用例去执行的时候 发现出现点击客户删除却无法删除 于是就提了一个单 但是开发后来发现删除客户没问题 又给我打回 后来我去查看服务器
  • “自顶向下,逐步求精”的方法

    1 什么叫做 自顶向下 逐步求精 目前软件开发方法使用最广泛的 当属结构化的方法和面向对象的方法 而其中 结构化程序设计支持 自顶向下 逐步求精 的程序设计方法 自顶向下 的具体内涵是将复杂 大的问题划分为小问题 找出问题的关键 重点所在
  • MYSQL数据库慢查询优化整理

    通常优化SQL的时候都需要查看慢查询日志 先找到查询慢的语句 再去进行优化 MYSQL开启慢查询日志 先查看是否开启了 登录MYSQL 输入以下模糊查询的语句show variables like query 可以看到红线中的三个属性 分别
  • xmind收费与免费的区别_你用什么来做笔记呢 现在聪明的人都开始用Xmind了

    以前读书的时候做笔记是个很麻烦的事情 如果从头写到尾倒还好 一旦发现中间缺漏了什么或者想加进去内容就会发现很可能 很大可能要重新写笔记 那个时候就想 要是能有个做笔记的软件 想加条内容或者减条内容很方便多好 而且不用先算计好要给下级文案留多
  • 【计算机网络】I/O多路转接之poll

    不同与select使用三个位图来表示三个fdset的方式 poll使用一个 pollfd的指针实现 pollfd结构包含了要监视的event和发生的event 不再使用select 参数 值 传递的方式 同时 pollfd并没有最大数量限制
  • CSS图片剪裁与原比例压缩或放大

    在前端网页制作的过程中 图片的处理往往比较头疼 当然不考虑你有很给力的美工后援的情况下 以下将对一些常见的CSS图片处理需求情况进行分析 1 一张图片要放在固定宽高的内容块中 并填充满整个内容块 看起来整齐划一 我们假设要把一张大小为192
  • cmake error:does not appear to contain CMAKEList.txt

    需要检查一下CMAKEList txt文件的权限 我这边在win10主机上git clone下载的代码 copy到ubuntu上 在ubuntu上执行cmake 提示找不到CMAKEList txt文件 排查了一圈 是因为权限问题 将文件权
  • 凯斯轴承数据故障诊断PHM轴承寿命预测深度学习迁移学习元学习开源代码集合

    实打实的开源手撸代码 没错 纯本人打造 保证精确度达到90 以上 可以看到可视化结果如下图所示
  • 这篇文章,让你了解ERC-1155 多代币标准协议

    文章目录 ERC1155 介绍 多代币标准 前提条件 代币标准 ERC 20 ERC 721 构建 ERC1155 代币合约 ERC 1155 的功能和特点 批量传输 批量余额 批量审批 接收钩子 支持非同质化代币 安全转账规则 ERC11