PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

本文转载自微信公众号 PlatON Cross

原创作者: PlatON Cross小编

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

合约一般可视为DApp的“后台”,不可避免将对一些业务相关的数据进行记录。本篇针对可能常用的三类结构(platon::StorageType、platon::db::Map、platon::db::MultiIndex)进行示例讲解。

其中platon::StorageType是最为灵活的使用方式,支持用户自定义数据结构,platon::db::Map的用法与std::map较为类似,platon::db::MultiIndex支持创建多索引的数据结构,便于根据不同的索引进行查询。由于链上存储有其独有的特征,这三类数据结构在操作性能上可能存在一定的差异,有机会笔者将在后续系列文章中将对此进行讲解。

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

说明:

1、本示例分别定了三种数据类型(_mUserMap、_mUser_table、_mUser_Data),用于存放UserDefinedData;

2、添加元素:AddUser,同时将数据写入三种数据类型中,可在.cpp实现中看到三种添加方式的区别,db::MultiIndex区别较大,需要通过lambda操作来进行元素构造添加;在本示例中,添加元素故意没有进行判重操作,在后续调用测试中,可见db::Map、StorageType中的相关元素都已经被覆盖,但db::MultiIndex中本身具备了判重的能力;

3、修改元素:ModifyUserInfo,同时修改三种数据类型中的相同元素,在操作上db::Map与用户在StorageType中自定义的Map类似,但db::MultiIndex区别较大,需要通过lambda操作来进行修改;

4、删除元素:UserErase,删除操作差别不大,值得一提的是db::Map没有提供相应的迭代器,可通过key直接删除;

5、清空元素:Clear,清空操作db::Map比较麻烦,需要先将所有的key存下来,具体做法可参见源码;

6、查询元素:从db::Map、StorageType中查询较为简单。db::MultiIndex支持多索引查询,其中通过唯一键(platon::db::IndexType::UniqueIndex)查询也比较简单,值得一提的是通过普通键进行查询,需要先通过get_index<“keyname”_n>()获取所有元素(内部做了顺序处理),然后通过cbigin(name)查找所有key匹配的元素,最终将返回多个普通键值为name的元素,详见.cpp中第104至114行。

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)
PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

● 调用结果

call addItem

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

说明:

第四次调用使用了与第三次效用相同的主键,本文示例故意没有在合约的添加元素操作中进行判重操作,这主要是为了体现三种结构的差异,结果将在getItems中呈现。

call getItems

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

说明:

在.py第53~55行可以看到,调用查询主键为3的元素,三种数据类型返回的值不一样,这是由于db::MultiIndex自带判重的操作。

call modifyItem

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

说明:

操作成功。

call ClearData

PlatON上的WASM智能合约开发(八)——进阶(内置数据结构)

说明:

操作成功。


总结

本文对WASM合约内置的几种典型数据结构进行了简单讲解,如在开发中遇到问题,可联系Cross团队。

本文转载自https://mp.weixin.qq.com/s/T2_fv8r_MWMyBqy22sG3zA

(1)
PlatONWorld-M6的头像PlatONWorld-M6管理员
上一篇 14 9 月, 2021 09:10
下一篇 14 9 月, 2021 10:42

相关推荐

发表回复

登录后才能评论