【加密社】深入理解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项目
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...