以太坊ERC1155协议分析及代码测试
以太坊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` 事件。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#transferfrom)transferFrom * transferFrom(uint256[] _itemId, address[] _from, address[] _to, uint256[] _value) 将把批量资产 `_itemId[]` 从一个或多个地址 `_from[]` 转移到指定的地址 `_to[]` 。地址和资产数组的长度要一致,以便一一对应。 必须触发 `Transfer` 事件。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#approve)approve * approve(uint256[] _itemId, address[] _spender, uint256[] _value) 批准触发帐户能够代表另一个帐户 `address[] _spender` 转移批量资产 `uint256[] _itemId` (使用transferFrom)。地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#increaseapproval)increaseApproval * increaseApproval(uint256[] _itemId, address[] _spender, uint256[] _addedValue) 增加一个或多个资产的授权量而不需要重置为0.地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#decreaseapproval)decreaseApproval 降低一个或多个资产的授权量而不需要重置为0.地址和资产数组的长度要一致,以便一一对应。 必须触发Approval事件。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#name)name * name(uint256 _itemId) 返回每个itemId资产对应的名称,本函数是可选的,但强烈建议要有。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#symbol)symbol 返回每个itemId资产对应的标识符,简称,本函数可选的。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#decimals)decimals * decimals(uint256 _itemId) 返回每个itemId资产对应的精度,就是个位数后还有几位,本函数是可选的,但强烈建议要有。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#totalsupply)totalSupply * totalSupply(uint256 _itemId) 返回每个itemId资产对应的供给总量。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#balanceof)balanceOf * balanceOf(uint256 _itemId, address _owner) 返回一个账号的itemId资产对应的余额量。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#allowance)allowance * allowance(uint256 _itemId, address _owner, address _spender) 返回approve授权函数的授权量,是指管理账号 `address _owner` 授予消费账号 `address _spender` 对资产 `uint256 _itemId` 的授权量。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#ownerof)ownerOf * ownerOf(uint256 _itemId) 返回NFT(非同质化)的特定资产 `_itemId` 对应的管理账号; 本函数是可选的。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#itemuri)itemURI * itemURI(uint256 _itemId) 返回一个特定的 `_itemId` 资产的独特统一资源标识符[ a distinct Uniform Resource Identifier (URI) ] 本函数是可选的。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#itembyindex)itemByIndex * itemByIndex(uint256 _itemId, uint256 _index) 返回非同质化资产 `_itemId` 的 `_index` 位置的? 本函数是可选的。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#itemofownerbyindex)itemOfOwnerByIndex * itemOfOwnerByIndex(uint256 _itemId, address _owner, uint256 _index) 返回一个特定管理账号 `address _owner` 下的资产 `_itemId` 的索引 `uint256 _index` 的? 本函数是可选的。 ## [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#non-fungible-items)Non-Fungible Items 在同一合同中将Fungible和Non-Fungible Items混合在一起的示例策略是在uint256 _itemID参数的前128位中传递item ID ,然后使用底部128位用于您希望传递给合同的任何额外数据。 非同质化资产可以同使用基于索引的智能合约/项目数据集的附件进行交互。 可以使用基于索引的标识将非同质化支持与智能合约/项目数据集进行交互。因此,访问混合数据合约中的特定资产集以及该集合中的特定NFT,_itemID可以切分成。 在合约代码内部,可以使用uint128(~0)提取访问单个NFT所需的两个数据,并将相同的掩码移位128。 ### [](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#example-of-split-id-bits)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,摘要
【本文目标】 待补充。
【前置条件】 待补充。
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, 参考
- 发表于 2019-12-27 07:00
- 阅读 ( 4274 )
- 学分 ( 6 )
- 分类:NFT
评论