全面掌握Solidity智能合约开发

2024年11月25日更新 208 人订阅
原价: ¥ 26 限时优惠
专栏简介 比特币区块结构Merkle树及简单支付验证分析 非对称加密技术- RSA算法数学原理分析 智能合约语言 Solidity 教程系列2 - 地址类型介绍 剖析非同质化代币ERC721-全面解析ERC721标准 搞懂 Solidity 事件Event - 如何在DApp中使用 以太坊扩容 之 分片(Sharding) 智能合约语言 Solidity 教程系列12 - 库的使用 深入理解Plasma(四)Plasma Cash 技术工坊42期 - 区块链子链技术及墨客链的实现方案 脱颖而出 | 成都链安入选『腾讯区块链加速器全球32强』 参与Eth2 Staking系列(2) - 激励篇 应用案例之黄金资产证券化Digix白皮书和DGD解读 全面理解智能合约升级 测试文章123456 简析主流匿名币:Dash、门罗币、Zcash、SERO 以太坊ERC1155协议分析及代码测试 Hyperledger Fabric 1.4 Kafka分布式环境搭建 跟我学 Solidity :开发环境 跟我学 Solidity:关于变量 跟我学 Solidity : 变量的存储 跟我学 Solidity :引用变量 跟我学 Solidity :函数 跟我学 Solidity :合约的创建和继承 跟我学 Solidity :工厂模式 用Web3.js构建第一个Dapp 跟我学Solidity:事件 Solidity 中 immutable (不可变量)与constant(常量) [译] Solidity 0.6.x更新:继承 解析 Solidity 0.6 新引入的 try/catch 特性 探究新的 Solidity 0.8 版本 探索以太坊合约委托调用(DelegateCall) 停止使用Solidity的transfer() 使用工厂提高智能合约安全性 Solidity 怎样写出最节省Gas的智能合约[译] Solidity 优化 - 编写 O(1) 复杂度的可迭代映射 Solidity 优化 - 控制 gas 成本 Solidity 优化 - 减少智能合约的 gas 消耗的8种方法 Solidity 优化 - 如何维护排序列表 Solidity 优化:打包变量优化 gas 在 Solidity中使用值数组以降低 gas 消耗 Solidity 技巧:如何减少字节码大小及节省 gas 计算Solidity 函数的Gas 消耗 "Stack Too Deep(堆栈太深)" 解决方案 合约实践:避免区块Gas限制导致问题 如何缩减合约以规避合约大小限制 Solidity 类特性 安全的处理 ERC20 转账(解决非标准 ERC20 问题) Solidity 十大常见安全问题 [译]更好Solidity合约调试工具: console.log 智能合约开发的最佳实践 - 强烈推荐

以太坊ERC1155协议分析及代码测试

  • 辉哥
  • 发布于 2019-12-27 07:00
  • 阅读 3993

以太坊ERC1155协议分析及代码测试

1,摘要

【本文目标】 待补充。

【前置条件】 待补充。

2,协议分析

2.1 协议描述函数列表:

solidity
interface ICryptoItems {
    // Events
    event Transfer(uint256 indexed _itemId, address indexed _from, address indexed _to, uint256 _value);
    event Approval(uint256 indexed _itemId, address indexed _owner, address indexed _spender, uint256 _value);

    // Required Functions
    function transfer(uint256[] _itemId, address[] _to, uint256[] _value) external returns (bool success);
    function transferFrom(uint256[] _itemId, address[] _from, address[] _to, uint256[] _value) external returns (bool success);
    function approve(uint256[] _itemId, address[] _spender, uint256[] _value) external returns (bool success);
    function increaseApproval(uint256[] _itemId, address[] _spender, uint256[] _addedValue) external returns (bool success);
    function decreaseApproval(uint256[] _itemId, address[] _spender, uint256[] _subtractedValue) external returns (bool success);

    // Required View Functions
    function totalSupply(uint256 _itemId) external view returns (uint256);
    function balanceOf(uint256 _itemId, address _owner) external view returns (uint256);
    function allowance(uint256 _itemId, address _owner, address _spender) external view returns (uint256);

    // Optional View Functions
    function name(uint256 _itemId) external view returns (string);
    function symbol(uint256 _itemId) external view returns (string);
    function decimals(uint256 _itemId) external view returns (uint8);

    // Optional Functions for Non-Fungible Items
    function ownerOf(uint256 _itemId) external view returns (address);
    function itemURI(uint256 _itemId) external view returns (string);
    function itemByIndex(uint256 _itemId, uint256 _index) external view returns (uint256);
    function itemOfOwnerByIndex(uint256 _itemId, address _owner, uint256 _index) external view returns (uint256);
}

2.2 函数说明:

transfer

  • transfer(uint256[] _itemId, address[] _to, uint256[] _value) 向目标地址 address[] _to 批量转账 uint256[] _itemId 资产。地址和资产数组的长度要一致,以便一一对应。 必须同时触发 Transfer 事件。

transferFrom

  • transferFrom(uint256[] _itemId, address[] _from, address[] _to, uint256[] _value) 将把批量资产 _itemId[] 从一个或多个地址 _from[] 转移到指定的地址 _to[] 。地址和资产数组的长度要一致,以便一一对应。 必须触发 Transfer 事件。

approve

  • approve(uint256[] _itemId, address[] _spender, uint256[] _value) 批准触发帐户能够代表另一个帐户 address[] _spender 转移批量资产 uint256[] _itemId (使用transferFrom)。地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。

increaseApproval

  • increaseApproval(uint256[] _itemId, address[] _spender, uint256[] _addedValue) 增加一个或多个资产的授权量而不需要重置为0.地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。

decreaseApproval

降低一个或多个资产的授权量而不需要重置为0.地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。

name

  • name(uint256 _itemId) 返回每个itemId资产对应的名称,本函数是可选的,但强烈建议要有。

symbol

返回每个itemId资产对应的标识符,简称,本函数可选的。

decimals

  • decimals(uint256 _itemId) 返回每个itemId资产对应的精度,就是个位数后还有几位,本函数是可选的,但强烈建议要有。

totalSupply

  • totalSupply(uint256 _itemId) 返回每个itemId资产对应的供给总量。

balanceOf

  • balanceOf(uint256 _itemId, address _owner) 返回一个账号的itemId资产对应的余额量。

allowance

  • allowance(uint256 _itemId, address _owner, address _spender) 返回approve授权函数的授权量,是指管理账号 address _owner 授予消费账号 address _spender 对资产 uint256 _itemId 的授权量。

ownerOf

  • ownerOf(uint256 _itemId) 返回NFT(非同质化)的特定资产 _itemId 对应的管理账号; 本函数是可选的。

itemURI

  • itemURI(uint256 _itemId) 返回一个特定的 _itemId 资产的独特统一资源标识符[ a distinct Uniform Resource Identifier (URI) ] 本函数是可选的。

itemByIndex

  • itemByIndex(uint256 _itemId, uint256 _index) 返回非同质化资产 _itemId_index 位置的? 本函数是可选的。

itemOfOwnerByIndex

  • itemOfOwnerByIndex(uint256 _itemId, address _owner, uint256 _index) 返回一个特定管理账号 address _owner 下的资产 _itemId 的索引 uint256 _index 的? 本函数是可选的。

Non-Fungible Items

在同一合同中将Fungible和Non-Fungible Items混合在一起的示例策略是在uint256 _itemID参数的前128位中传递item ID ,然后使用底部128位用于您希望传递给合同的任何额外数据。 非同质化资产可以同使用基于索引的智能合约/项目数据集的附件进行交互。 可以使用基于索引的标识将非同质化支持与智能合约/项目数据集进行交互。因此,访问混合数据合约中的特定资产集以及该集合中的特定NFT,_itemID可以切分成。 在合约代码内部,可以使用uint128(~0)提取访问单个NFT所需的两个数据,并将相同的掩码移位128。

Example of split ID bits

uint256 baseToken = 12345 << 128;
uint128 index = 50;

balanceOf(baseToken, msg.sender); // 获取基础通证的余额;
balanceOf(baseToken + index, msg.sender); // 获取非同质化通证索引对应的余额。

3,代码实现

4,智能合约测试

5, 参考

点赞 1
收藏 1
分享

0 条评论

请先 登录 后评论