第二十课 以太坊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: base item id><uint128: index of NFT>。
在合约代码内部,可以使用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, 参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容