sui move动态字段练习(5)- 总结与思考

引言

之前几篇文章,我们用sui move动态字段模拟solidity映射,实现了一个类似erc20的代币,这使我更加深刻地理解了sui move和solidity编程特性和编程思想的区别。下面是我的总结与思考。

总结

首先,sui与solidity的编程特性有很大差异。

solidity

solidity是面向以太坊虚拟机(EVM)的合约编程语言,以太坊状态树储存了各个账号下的状态,而合约账户是由智能合约定义转变状态的规则。
例如在同质化代币的实现中,solidity需要使用映射这一类型储存各个账户的余额,代币被用储存在合约账户的数字替代,实际上持有代币的余额就是合约账户下储存的数字。
比如,小蓝要查询自己拥有多少代币,就需要查询代币合约下以小蓝地址为键的映射的值。小蓝要向小红转账10个代币,合约会先检查小蓝的余额是否大于转账数额,如果大于,就会将小蓝余额的对应值减去10,将小红余额对应值加10.

sui

sui是面向资源编程。资源是具有key能力的对象,这意味它可以在全局存储中用做键,资源都具有所有者属性来声明其所有权。所有权分为:被地址拥有,被另一个资源拥有,可变的共享,不可变的共享。而sui move中module可以称为合约,它规定了相应资源的生成,销毁,查询等规则,多个module可以部署在一个package下。只有module才能创建资源,只有资源的拥有者才能在交易中使用资源(共享资源除外),只有创建资源的module才能对资源内的属性进行改变。

与solidity不同的是,sui中可以将余额封装后创建Token资源,这样Token资源的所有者就是Token的持有者,对Token具有使用权。相比于单纯数字的增减,持有者真正拥有了数字资产。

虽然Sui是纯静态的语言,但是泛型为其提供了很大的灵活性。在solidity中,我们如果想要发行多种Token,就需要部署多个合约,分别储存不同代币的余额状态。而在sui中,我们只需要使用泛型,就可以使用一个module发行相同规则的不同代币。

在分析下solidity映射与sui动态字段的区别
要深入理解solidity的映射,我们需要对以太坊合约的储存布局有所了解。以太坊中每个特定地址的智能合约都有自己的"储存",储存是一个 2256 ✖ 2256大小的键值映射
这是一个很大的数字,但我们不需要担心它会占用太多空间,因为大部分的储存都未被使用,只有在非零值被写入时,才会被写入数据库。
我们将每一个储存的值是32字节,我们叫它插槽。每一个储存的键也是32字节大小,键的范围为0 ~ 2*256-1。那第一个插槽就成为slot(0),第二个插槽为slot(1),… ,第n个插槽就是slot(n-1)。
而在solidity中,映射在储存中的布局遵循特定的规则。
首先solidity的映射类型本身顺序占据一个插槽slot(i),映射的键为k, 则此映射的值会被储存在keccak256(k,p),我们可以根据此规则很轻松的找到相应值的位置
例如:

    contract ERC20{mapping (address => uint256) balanceOf;}

balanceOf储存映射储存对应地址的代币余额
我们知道小蓝的地址为0x312bEeF78F3efa18cc4B94D489fCD43fEb5BbA9E,那么小蓝代币余额储存的计算:

  1. balanceOf映射自身顺序占据slot(0), p = 0 ;
  2. 键为小蓝的地址, k = 0x312bEeF78F3efa18cc4B94D489fCD43fEb5BbA9E
  3. 余额储存在 slot( keccak256(abi.encode(address(0x312bEeF78F3efa18cc4B94D489fCD43fEb5BbA9E), 0)) )
    这样来看,当一个映射的储存记录无限多时,取出一个键对应的值事件复杂度为O(1).

在sui move中,我们使用的table,bag等类型的底层实现都为动态字段
添加一个动态字段,实质上是为对象添加了一个子对象

        let field = Field {id: object::new_uid_from_hash(hash),name,value,};add_child_object(object_addr, field)

结语

综上,sui的编程特性确定了sui的编程风格,sui官方实现的同质化代币coin很好的体现了sui的编程特性,泛型的灵活运用,无需使用数字来表示所有者对资产的持有,而是通过将余额封装为coin资源使所有者持有,比起在sui中模拟映射,不仅便利,而且安全(减少了出现合约编写的逻辑漏洞的可能)。因此,我才说’本例实现仅用于学习动态字段,由于访问gas和便捷性不强,无法用于生产。在sui move中使用的同质化代币请使用官方标准库中内置的coin’.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 各种方位计算 - client系列 offset系列 scroll系列 x/y 系列

offset系列 HTMLElement.offsetTop - Web API 接口参考 | MDN 一文读懂offsetHeight/offsetLeft/offsetTop/offsetWidth/offsetParent_heightoffset-CSDN博客 client系列 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop-CSDN博客 scroll系列 秒懂scr…

2024年,如何使用chatgpt4.0为工作赋能?

ChatGPT 4.0的工作原理和功能 ChatGPT 4.0的工作原理和功能可以从以下几个方面进行详细说明: 工作原理 ChatGPT 4.0的工作原理主要基于深度学习技术,特别是Transformer模型的应用。它通过大量的文本数据进行训练,学习语言的模式和规律&…

Android 启动service(Kotlin)

一、使用startForegroundService()或startService()启用service **Activity //启动service val intent: Intent Intent(ServiceActivitythis,MyService::class.java) //Build.VERSION_CODES.O 26 // Android8以后,不允许后台启动Service i…

波特图笔记

波特图相关知识 介绍波特图之前,首先要介绍放大电路的复频域分析的相关概念。 增益函数 放大器工作在小信号时,晶体管可以用线性模型近似。忽略温度等参数对元件的影响,认为放大器是一个线性是不变系统。输入信号和输出信号之间关系可以用线性常系数微分方程来进行描述。…

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT,仅供学习参考。 ​​​​​​​

vsto快速在excel中查找某个字符串

是的,使用foreach循环遍历 Excel.Range 可能会较慢,特别是在大型数据集上。为了提高效率,你可以考虑使用 Value 属性一次性获取整个范围的值,然后在内存中搜索文本。这样可以减少与 Excel 之间的交互次数,提高性能。 …

嵌入式3-15

1、整理思维导图 2、整理课上单向循环链表的代码 3、完成双向链表的剩下四个功能 2、 node_p create_list()//创建链表 { node_p p(node_p)malloc(sizeof(node)); if(pNULL) { printf("申请失败\n"); return NULL; } p->len…

使用VLC实现自动播放视频

VLC是一款开源的多媒体播放器,它支持大量的视频和音频格式,并且具有强大的脚本和编程接口。虽然VLC本身并没有内置的编程语言,但你可以通过其命令行接口或Lua脚本来实现自动化播放视频的功能。 以下是一个简单的示例,展示如何使用…

尼伽OLED透明屏闪耀第24届中国零售业博览会,引领零售行业革新

2024 CHINA SHOP 第二十四届中国零售业博览会 3.13-15 上海 3.13-15日,第24届中国零售业博览会盛大开幕,起立科技(旗下品牌:起鸿、尼伽)携其自主研发的30寸OLED透明屏和移动AI透明屏机器人惊艳亮相,成为展…

【PTA】L1-039 古风排版(C++)

题目链接:L1-039 古风排版 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录: 目录: 题目要求: 输入格式: 输出格式: 输入样例: 输出样例: 思路: 代码: 测试结…

Vulnhub - Jarbas

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers Blog Jarbas 靶机下载地址:https://www.vulnhub.com/entry/jarbas-1,232/ 0x01 信息收集 Nmap…

C语言简单题(5)倍数问题、温度转换、输入半径得周长和面积

/* 判断输入的正整数既是5的倍数&#xff0c;又是7的倍数 */ #include<stdio.h> int main(){ int num; printf("请输入一个正整数&#xff1a;"); scanf("%d",&num); if(num%50 && num%70){ printf("…

10分钟用docker搭建【devops】

1.gitlab docker run -d --name gitlab --restartalways --network devops-network -p 8000:80 -p 443:443 -v C:/docker/gitlab/config:/etc/gitlab -v C:/docker/gitlab/logs:/var/log/gitlab -v C:/docker/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest运行完成记得…

Java Web项目—餐饮管理系统Day04-公共字段填充与菜品分类管理

文章目录 1. 公共字段填充菜品分类管理1. 搭建框架2. 编写功能2-1. 分页查询2-2 插入2-3 更新2-4 删除 1. 公共字段填充 前面我们已经完成了后台系统的员工管理功能开发&#xff0c;在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工时需要…

智慧工地管理平台APP源码基于物联网、云计算、大数据等技术

目录 ​系统特点 智慧工地云平台功能模块 1、基础数据管理 2、考勤管理 3、安全隐患管理 4、视频监控 5、塔吊监控 6、升降机监控 7、管理分析报表 8、移动端数据推送 9、数据接收管理 智慧工地管理平台系统基于物联网、云计算、大数据等技术&#xff0c;助力工地管理…

wsl ubuntu 安装cuda环境

wsl ubuntu 安装cuda环境: CUDA Toolkit 11.6 Downloads | NVIDIA DeveloperDownload CUDA Toolkit 11.6 for Linux and Windows operating systems.https://developer.nvidia.com/cuda-11-6-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=W…

前端工程化:提升开发效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

安卓UI面试题 31-35

31. 简述 Paint类中主要绘制方法 ?1、图形绘制: setArgb(int a, int r, int g, int b):设置绘制的颜色,a表示透明度,r、g、b表示颜色值; setAlpha(int a):设置绘制的图形的透明度; setColor(int color):设置绘制的颜色; setAntiAlias(boolean a):设置是否使用抗锯齿…

Python Web开发记录 Day11:Django part5 管理员管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、创建管理员表2、管理员列表3、添加管理员①添…

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…