【加密社】深入理解TON智能合约 (FunC语法)
king:
摘要:在TON(TheOpenNetwork)区块链平台中,智能合约扮演着举足轻重的角色。本文将通过分析一段TON智能合约代码
带领读者学习dict(字典)和list(列表)在FunC语言中的用法,以及如何在实际场景中实现高效的验证者选举。一、引言TON区块链平台的智能合约采用FunC语法
一、引言
TON区块链平台的智能合约采用FunC语言编写,该语言提供了丰富的数据结构,如dict和list,用于存储和处理数据。在本篇文章中,我们将通过分析一段验证者选举的代码,探讨dict和list的用法。
二、dict(字典)的用法
2.1 字典定义与初始化
在FunC语言中,字典是一种键值对的数据结构,用于存储和检索数据。以下是如何定义和初始化一个字典:
var sdict = new_dict();
这里,我们创建了一个名为sdict
的空字典。
2.2 字典操作
(1)添加元素
向字典中添加元素可以使用以下方法:
sdict~dict_set_builder(128 + 32 + 256, key, begin_cell().store_uint(min(max_factor, max_stake_factor), 32).store_uint(addr, 256).store_uint(adnl_addr, 256));
这里,我们使用dict_set_builder
方法将一个键值对添加到字典中。键由128位、32位和256位的数据组成,值则是一个包含32位、256位和256位数据的元组。
(2)删除元素并获取最小键
以下代码展示了如何删除字典中的最小键元素并获取其值:
var (key, cs, f) = sdict~dict::delete_get_min(128 + 32 + 256);
这里,我们使用delete_get_min
方法删除字典中的最小键元素,并返回该键及其对应的值。
三、list(列表)的用法
3.1 列表定义与初始化
在FunC语言中,列表用于存储一系列元素。以下是如何定义和初始化一个列表:
var l = nil;
这里,我们创建了一个名为l
的空列表。
3.2 列表操作
(1)添加元素
向列表中添加元素可以使用以下方法:
l = cons([stake, max_f, pubkey, adnl_addr], l);
这里,我们使用cons
函数将一个元组添加到列表的头部。
(2)遍历列表
以下代码展示了如何遍历列表并获取元素:
var [stake, max_f, pubkey, adnl_addr] = l~list_next();
这里,我们使用list_next
方法获取列表中的下一个元素。
四、实战:验证者选举
在分析了dict和list的用法后,我们来探讨如何在实际场景中实现验证者选举。以下代码片段展示了如何通过dict和list选出满足条件的验证者:
// ... 省略了部分代码
repeat (m - 1) {l1 = cdr(l1);
}
var m_stake = car(l1).at(0); // 最小质押量
// ... 省略了部分代码
do {var [stake, max_f, pubkey, adnl_addr] = l~list_next();// ... 省略了部分代码if (i < m) {// ... 省略了部分代码vset~udict_set_builder(16, i, vinfo);}// ... 省略了部分代码
} until (l.null?());
// ... 省略了部分代码
五、总结
通过分析这段TON智能合约代码,我们学习了dict和list在FunC语言中的用法,以及如何在实际场景中实现高效的验证者选举。掌握这些数据结构的操作,对于编写高效的TON智能合约具有重要意义。希望本文能为读者在FunC语言编程之路上提供有益的参考。
六、dict和list的高级用法
6.1 dict的嵌套使用
在实际应用中,我们经常会遇到需要在字典中存储复杂结构的情况,这时可以使用字典的嵌套。
var nested_dict = new_dict();
nested_dict~dict_set(256, pubkey, new_dict().dict_set(128, "stake", stake).dict_set(32, "time", time));
在上面的代码中,我们创建了一个嵌套字典nested_dict
,其中每个公钥pubkey
对应一个包含质押量stake
和质押时间time
的字典。
6.2 list的排序与查找
在TON智能合约中,list不仅可以用于存储数据,还可以进行排序和查找操作。
l = sort(l, func(a, b) { return a.at(0) > b.at(0); });
这里,我们使用sort
函数对列表l
进行排序,排序依据是列表中元组的第一个元素。
查找操作可以通过遍历列表实现:
var found = false;
var result = nil;
foreach (item in l) {if (item.at(0) == target) {found = true;result = item;break;}
}
在上面的代码中,我们遍历列表l
,查找第一个元素等于target
的元组。
七、案例分析:基于dict和list的投票系统
7.1 需求分析
假设我们要在TON智能合约中实现一个简单的投票系统,允许用户对候选人进行投票。我们需要存储候选人的信息、投票者的信息以及投票结果。
7.2 数据结构设计
我们可以使用以下数据结构来存储投票系统的信息:
- 候选人字典(candidates_dict):键为候选人ID,值为候选人信息(姓名、得票数等)。
- 投票者字典(voters_dict):键为投票者地址,值为投票者信息(已投票候选人ID、投票时间等)。
7.3 代码实现
以下是投票系统的部分实现:
var candidates_dict = new_dict();
var voters_dict = new_dict();
// 添加候选人
function add_candidate(candidate_id, name) {candidates_dict~dict_set(256, candidate_id, new_dict().dict_set(256, "name", name).dict_set(64, "votes", 0));
}
// 投票
function vote(voter_addr, candidate_id) {// 检查投票者是否已投票var voted = voters_dict~dict_get?(256, voter_addr);if (voted) {throw(1); // 已投票,抛出异常}// 更新候选人得票数var candidate_info = candidates_dict~dict_get(256, candidate_id);candidate_info~dict_set(64, "votes", candidate_info~dict_get(64, "votes") + 1);// 记录投票者信息voters_dict~dict_set(256, voter_addr, new_dict().dict_set(256, "candidate_id", candidate_id).dict_set(32, "time", now()));
}
// 获取投票结果
function get_results() {var results_list = new_list();foreach (candidate_id, candidate_info in candidates_dict) {results_list = cons([candidate_info~dict_get(256, "name"), candidate_info~dict_get(64, "votes")], results_list);}return sort(results_list, func(a, b) { return a.at(1) > b.at(1); });
}
7.4 分析与总结
在这个投票系统的案例中,我们使用了dict来存储候选人和投票者的信息,使用list来存储投票结果。通过dict的嵌套使用,我们实现了复杂的数据结构。同时,利用list的排序功能,我们可以轻松地获取按得票数排序的候选人列表。
八、优化与扩展
在实际应用中,我们可能需要对dict和list的使用进行优化和扩展,以提高智能合约的性能和功能。
8.1 优化dict的存储空间
在存储大量数据时,dict的存储空间可能成为瓶颈。我们可以通过以下方式优化:
- 使用更紧凑的数据结构,如位字段。
- 删除不必要的字段,减少存储空间。
8.2 扩展list的功能
FunC语言提供了丰富的内置函数,我们可以通过以下方式扩展list的功能:
- 使用
map
、filter
等高阶函数对列表进行处理。 - 实现自定义的列表操作函数,如分组、聚合等。
九、总结
本文通过分析TON智能合约中的验证者选举代码,详细介绍了dict和list在FunC语言中的用法。我们首先探讨了dict和list的基本操作,包括创建、添加元素、删除元素等。随后,我们通过一个实际的投票系统案例,展示了如何在TON智能合约中运用dict和list来构建复杂的数据结构和业务逻辑。
在高级用法部分,我们介绍了dict的嵌套使用和list的排序与查找功能,这些高级特性使得TON智能合约能够处理更加复杂的数据处理任务。通过案例分析,我们不仅学习了如何使用这些数据结构,还了解了如何在智能合约中实现业务逻辑。
在优化与扩展部分,我们提出了针对dict和list的优化策略,以及如何通过内置函数和自定义函数来扩展list的功能。这些优化和扩展策略对于提高智能合约的性能和可维护性至关重要。
最后,以下是几点关于TON智能合约中dict和list用法的总结:
- 灵活的数据结构:dict和list是TON智能合约中非常灵活的数据结构,它们可以用来存储和处理各种类型的数据。
- 高效的数据处理:通过合理使用dict和list,可以高效地处理数据,尤其是在选举、投票等需要排序和查找的场景中。
- 优化存储:在智能合约中,存储空间是非常宝贵的资源。合理设计dict和list的结构,可以有效地节省存储空间。
- 扩展性:通过内置函数和高阶函数,可以轻松扩展list的功能,满足不同的业务需求。
- 安全性:在使用dict和list时,需要注意数据的一致性和安全性,避免出现数据泄露或被篡改的风险。
通过本文的学习,我们希望读者能够掌握TON智能合约中dict和list的用法,并在实际开发中灵活运用这些知识,构建出高效、安全、可扩展的智能合约。
十、结语
TON智能合约的开发是一个不断学习和实践的过程。dict和list作为FunC语言的核心数据结构,其重要性不言而喻。通过深入理解这些数据结构的用法,开发者可以更好地利用TON区块链平台的优势,创造出更加丰富和强大的去中心化应用。随着TON生态的不断发展,我们期待看到更多创新和高效的智能合约应用,为区块链技术的普及和发展贡献力量。
本文旨在提供一个学习和参考的起点,对于更深入的技术细节和最佳实践,建议读者继续探索官方文档、社区讨论以及相关的技术文章。在未来的智能合约开发旅程中,愿每一位开发者都能够不断进步,为区块链技术的进步贡献自己的力量。
相关文章:

【加密社】深入理解TON智能合约 (FunC语法)
king: 摘要:在TON(TheOpenNetwork)区块链平台中,智能合约扮演着举足轻重的角色。本文将通过分析一段TON智能合约代码 带领读者学习dict(字典)和list(列表)在FunC语言中的用法&#x…...

笔试强训day11
游游的水果大礼包 #include <iostream> #define int long longusing namespace std; int n, m, a, b;signed main() {cin>>n>>m>>a>>b;int ret 0;for(int x 0; x < min(n / 2, m); x) // 枚举 1 号礼包的个数{int y min(n - x * 2, (m - …...

移动应用开发与测试赛题
引言 在现代车载系统开发中,UI设计和编程实现同样重要。本文将分别探讨车载系统的UI设计任务和相关的编程任务,帮助开发者全面了解车载系统开发的各个方面。 第一部分:UI设计任务 任务1:绘制"左转向视频显示"模块界面…...

Qt常用控件——QLineEdit
文章目录 QLineEdit核心属性和信号基本示例正则表达式约束验证输入密码是否一致密码显示状态切换 QLineEdit核心属性和信号 QLineEdit用来表示单行输入,可以输入一段文本,但是不能替换 核心属性: 属性说明text输入框中的文本inputMask输入…...

(postman)接口测试进阶实战
1.内置和自定义的动态参数 内置的动态参数有哪些? ---{{$}}--是内置动态参数的标志 //自定义的动态参数 此处date.now()的作用就相当于上面的timestamp 2.业务闭环及文件接口测试 返回的url地址可以在网页中查询得到。 3. 常规断言,动态参数断言…...

R语言统计分析——功效分析(比例、卡方检验)
参考资料:R语言实战【第2版】 1、比例检验 当比较两个比例时,可使用pwr.2p.test()函数进行功效分析。格式为: pwr.2p.test(h, n, sig.level, power, alternative) 其中,h是效应值,n是各相同的样本量。效应值h的定义如…...

Leetcode 每日一题:Longest Increasing Path in a Matrix
写在前面: 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想,绝对和 DFS 相关,但是题目的优化要求非常高,对于语言和内存特性的考察特别丰富,如果是…...

ARCGIS PRO DSK MapTool
MapTool用于自定义地图操作工具,使用户能够在ArcGIS Pro中执行特定的地图交互操作。添加 打开MapTool1.vb文件,可以看到系统已经放出MapTool1类: Public Sub New()将 IsSketchTool 设置为 true 以使此属性生效IsSketchTool TrueSketchTyp…...

国网B接口 USC安防平台 海康摄像机配置
国网B接口海康摄像机配置介绍 如下以海康DS-NACN6432I-GLN摄像机为例,配置国网B接口设备接入流程,海康摄像机的固件版本为 V5.6.11 build 210109 210107。该设备为球机,支持国网B接口云台控制功能。图标编号可以对应二者的配置。 注意 同一…...

Win10安装.net FrameWork3.5失败解决方法
win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…...

【pipenv】—— 虚拟环境管理工具近乎全面的总结
安装 pip install pipenv 使用和配置 设置虚拟环境文件创建在项目根目录 添加环境变量:WORKON_HOMEPIPENV_VENV_IN_PROJECT 创建虚拟环境时,自动换用指定的pip源 添加环境变量:PIPENV_TEST_INDEXhttps://pypi.tuna.tsinghua.edu…...

windows C++-并行编程-并行算法(五) -选择排序算法
并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 在许多情况下,parallel_sort 会提供速度和内存性能的最佳平衡。 但是,当您增加数据集的大小、可用处理器的数量或…...

【系统架构设计师-2014年真题】案例分析-答案及详解
更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【材料1】问题1问题2【材料2】问题1问题2问题3【材料3】问题1问题2问题3【材料4】问题1问题2【材料5】问题1问题2问题3【材料1】 请详细阅读以下关于网络设备管理系统架构设计的说明,在答题纸上回答问题1和问题2。 …...

windows C++-并行编程-并行算法(三)-分区工作
并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 若要对数据源操作进行并行化,一个必要步骤是将源分区为可由多个线程同时访问的多个部分。 分区程序将指定并行算法应如何在线…...

下载 llama2-7b-hf 全流程【小白踩坑记录】
1、文件转换 在官网 https://ai.meta.com/llama/ 申请一个账号,选择要下载的模型,会收到一个邮件,邮件中介绍了下载方法 执行命令 git clone https://github.com/meta-llama/llama.git ,然后执行 llama/download.sh,…...

Codeforces practice C++ 2024/9/11 - 2024/9/13
D. Mathematical Problem Codeforces Round 954 (Div. 3) 原题链接:https://codeforces.com/contest/1986/problem/D 题目标签分类:brute force,dp,greedy,implementation,math,two pointers…...

RabbitMQ创建交换机和队列——配置类 注解
交换机的类型 Fanout:广播,将消息交给所有绑定到交换机的队列。 Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列。 Topic:通配符订阅,与Direct类似,只不…...

proteus+51单片机+AD/DA学习5
目录 1.DA转换原理 1.1基本概念 1.1.1DA的简介 1.1.2DA0832芯片 1.1.3PCF8591芯片 1.2代码 1.2.1DAC8053的代码 1.2.2PCF8951的代码 1.3仿真 1.3.1DAC0832的仿真 1.3.2PFC8951的仿真 2.AD转换原理 2.1AD的基本概念 2.1.1AD的简介 2.1.2ADC0809的介绍 2.1.3XPT2…...

【Python机器学习】长短期记忆网络(LSTM)
目录 随时间反向传播 实践 模型的使用 脏数据 “未知”词条的处理 字符级建模(英文) 生成聊天文章 进一步生成文本 文本生成的问题:内容不受控 其他记忆机制 更深的网络 尽管在序列数据中,循环神经网络为对各种语言关系…...

【Go】使用Goland创建第一个Go项目
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

STM32学习笔记(一、使用DAP仿真器下载程序)
我们想要使用32单片机,总共包含四个步骤: 1、硬件连接 2、仿真器配置 3、编写程序 4、下载程序 一、第一个问题(硬件连接):如何进行硬件连接,才能够启动32板子并能够下载程序呢? 答&#…...

储能运维管理云平台解决方案EMS能量管理系统
在储能行业蓬勃发展的今天,储能运维管理的重要性日益凸显。而储能运维管理云平台的出现,正为储能系统的稳定运行和高效管理注入了新的活力。 一、储能运维管理面临的挑战 传统的储能运维管理方式往往依赖人工巡检和现场操作,存在诸多问题。比…...

网络药理学:16、速通流程版
一、筛选疾病靶点 GeneCards 下载数据得到GeneCards-SearchResult.csv通过Relevance score≥1.0得到GeneCards.csv步骤2只保留Gene Symbol,即基因名这一列得到GeneCards_gene_names.csv OMIM 下载数据得到OMIM-Gene-Map-Retrieval.xlsx只保留Gene/Locus…...

P2515 [HAOI2010] 软件安装
~~~~~ P2515 [HAOI2010] 软件安装 ~~~~~ 总题单链接 思路 ~~~~~ 发现构成的图是一个森林和一些环。 ~~~~~ 对于森林,建一个虚点然后树形 D P DP DP 即可。 ~~~~~ 对于环,发现要么把这个环上的每一个点都选了,要么每一个都不选。所以可以先缩…...

51单片机快速入门之定时器和计数器
51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…...

【计算机网络 - 基础问题】每日 3 题(一)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...

Unity全面取消Runtime费用 安装游戏不再收版费
Unity宣布他们已经废除了争议性的Runtime费用,该费用于2023年9月引入,定于1月1日开始收取。Runtime费用起初是打算根据使用Unity引擎安装游戏的次数收取版权费。2023年9月晚些时候,该公司部分收回了计划,称Runtime费用只适用于订阅…...

IDEA测试类启动报 “java: 常量字符串过长” 解决办法
目录标题 问题描述问题分析解决办法其他办法 问题描述 问题分析 字符串长度过长,导致 idea 默认使用的 javac 编译器编译不了。 查询资料发现,原因是javac在编译期间,常量字符串最大长度为65534。 解决办法 Javac 编译器改为 Eclipse 编译…...

计算机科学基础 -- 访存单元
访存单元(Memory Access Unit)的概念 访存单元(Memory Access Unit) 是处理器中的一个关键模块,负责处理指令中的内存访问操作,包括从内存中读取数据和将数据写入内存。由于内存访问速度通常比处理器执行速…...

Linux压缩、解压缩、查看压缩内容详解使用(tar、gzip、bzip2、xz、jar、war、aar)
在Linux环境中,你可以使用各种命令来压缩、解压缩和查看不同类型的压缩包。以下是常用的命令和操作说明,包括tar、gzip、bzip2、xz、jar、war、aar等类型的包文件。 1. tar命令:压缩、解压、查看tar包 压缩: tar -cvf archive.…...