【加密社】深入理解TON智能合约 (FunC语法)

news/2024/9/18 14:49:41/ 标签: 智能合约

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的功能:

  • 使用mapfilter等高阶函数对列表进行处理。
  • 实现自定义的列表操作函数,如分组、聚合等。

九、总结

本文通过分析TON智能合约中的验证者选举代码,详细介绍了dict和list在FunC语言中的用法。我们首先探讨了dict和list的基本操作,包括创建、添加元素、删除元素等。随后,我们通过一个实际的投票系统案例,展示了如何在TON智能合约中运用dict和list来构建复杂的数据结构和业务逻辑。

在高级用法部分,我们介绍了dict的嵌套使用和list的排序与查找功能,这些高级特性使得TON智能合约能够处理更加复杂的数据处理任务。通过案例分析,我们不仅学习了如何使用这些数据结构,还了解了如何在智能合约中实现业务逻辑。

在优化与扩展部分,我们提出了针对dict和list的优化策略,以及如何通过内置函数和自定义函数来扩展list的功能。这些优化和扩展策略对于提高智能合约的性能和可维护性至关重要。

最后,以下是几点关于TON智能合约中dict和list用法的总结:

  1. 灵活的数据结构:dict和list是TON智能合约中非常灵活的数据结构,它们可以用来存储和处理各种类型的数据。
  2. 高效的数据处理:通过合理使用dict和list,可以高效地处理数据,尤其是在选举、投票等需要排序和查找的场景中。
  3. 优化存储:在智能合约中,存储空间是非常宝贵的资源。合理设计dict和list的结构,可以有效地节省存储空间。
  4. 扩展性:通过内置函数和高阶函数,可以轻松扩展list的功能,满足不同的业务需求。
  5. 安全性:在使用dict和list时,需要注意数据的一致性和安全性,避免出现数据泄露或被篡改的风险。

通过本文的学习,我们希望读者能够掌握TON智能合约中dict和list的用法,并在实际开发中灵活运用这些知识,构建出高效、安全、可扩展的智能合约

十、结语

TON智能合约的开发是一个不断学习和实践的过程。dict和list作为FunC语言的核心数据结构,其重要性不言而喻。通过深入理解这些数据结构的用法,开发者可以更好地利用TON区块链平台的优势,创造出更加丰富和强大的去中心化应用。随着TON生态的不断发展,我们期待看到更多创新和高效的智能合约应用,为区块链技术的普及和发展贡献力量。

本文旨在提供一个学习和参考的起点,对于更深入的技术细节和最佳实践,建议读者继续探索官方文档、社区讨论以及相关的技术文章。在未来的智能合约开发旅程中,愿每一位开发者都能够不断进步,为区块链技术的进步贡献自己的力量。


http://www.ppmy.cn/news/1525206.html

相关文章

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

人工智能 | 搭建企业内部的大语言模型系统

大纲 开源大语言模型大语言模型管理私有大语言模型服务部署方案 开源大语言模型 担心安全与隐私&#xff1f;可私有部署的开源大模型 商业大模型&#xff0c;不支持私有部署 ChatGPTClaudeGoogle Gemini百度问心一言 开源大模型&#xff0c;支持私有部署 MistralMeta Llama…

【LeetCode】:面试题 16.05. 阶乘尾数

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 好久没有写文章了&#xff0c;今天碰见了一道有趣的题目&#xff0c;写下来分享一下。 &#x1f3c6;1.问题描…

【QT】系统-上

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;事件QWidget中常见的事件 &#x1f449;&#x1f3fb;处理鼠标事件&#xff1a;leaveEvent和enterEvent&#x1f449;&a…

简单代码实现视频转图片_py

目录 1.安装OpenCV 环境要求 安装命令 验证安装 2. OpenCV用法 3.实现程序 博主最近在研究深度学习&#xff0c;需要收集数据集进行处理&#xff0c;但一张张拍照真是太麻烦了 就想着&#xff0c;哎&#xff0c;能不能写一个程序&#xff0c;把视频转成图片不就行了&am…

tabBar设置底部导航栏

如果应用是一个多 tab 应用&#xff0c;可以通过 tabBar 配置项指定一级导航栏&#xff0c;以及 tab 切换时显示的对应页&#xff0c;简单来说就是像美团外卖下面的导航栏一样可以任意切换 1.首先创建三个页面&#xff0c;在页面里面可以写一些东西或者放一张图片方便区分。 2.…

http网络请求与下载进度

Http_request 目录 一、XMLHttpRequest 在使用 Fetch API 进行网络请求时&#xff0c;原生的 Fetch API 并不直接支持获取下载进度的功能&#xff0c;因为 Fetch API 主要是基于 Promise 的&#xff0c;它主要关注于请求的成功或失败&#xff0c;以及响应数据的处理&#xff…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

MVC设计模式与delegate,tablview,Appdelegate,SceneDelegate

一、MVC MVC就是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09; 例如上面的 excel表&#xff0c; 数据、数据结构就是模型Model 根据数据形成的直观的、用户能直接看见的柱形图是视图View 数据构成的表格…

假期学习-- iOS 通知详解

iOS 通知详解 数据结构 从我们之前使用通知的流程和代码来看&#xff0c;通知其实就是一个单例&#xff0c;方便随时访问。 NSNotificationCenter&#xff1a;消息中心 这个单例类中主要定义了两个表&#xff0c;一个存储所有注册通知信息的表的结构体&#xff0c;一个保存…

模版方法模式template method

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

神经网络学习笔记——如何设计、实现并训练一个标准的前馈神经网络

1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from333.337.search-card.all.click&vd_source0b1f472915ac9cb9cdccb8658d6c2e69 一、如何设计、实现并训练一个标准的前馈神经网络&#xff0c;用于手写数字图像的分类&#xff0c;重…

【SpringBoot3】面向切面 AspectJ AOP 使用详解

文章目录 一、AspectJ介绍二、简单使用步骤1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点&#xff08;Pointcut&#xff09;1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知&#xff0…

Unix时间戳与C语言的time.h库函数

目录 Unix时间戳介绍 UTC/GMT 时间与秒计数器转换代码 time.h库函数 Unix时间戳介绍 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器…

15.5 创建监控控制平面的service

本节重点介绍 : k8s中service的作用和类型创建k8s控制平面的service 给prometheus采集用&#xff0c; 类型clusterIp kube-schedulerkube-controller-managerkube-etcd service的作用 Kubernetes Service定义了这样一种抽象&#xff1a; Service是一种可以访问 Pod逻辑分组…

MATLAB求解0-1线性规划问题的详细分析

引言 0-1线性规划是整数规划中的一种特殊形式&#xff0c;它广泛应用于资源分配、工厂选址、投资组合优化、物流运输等多个领域。0-1线性规划的特点是&#xff0c;决策变量只能取0或1的离散值&#xff0c;通常用于描述“是-否”决策问题。随着计算机技术的发展&#xff0c;数学…

《仙境传说RO:新启航》游戏攻略:VMOS云手机提升装备获取辅助!自由交易,辅助挂机操作!

在《仙境传说RO&#xff1a;新启航》中&#xff0c;想要快速提升战斗力并获取顶级装备&#xff0c;玩家需要熟练掌握多种获取资源与提升角色的途径。为了让玩家更加轻松地享受游戏&#xff0c;VMOS云手机推出了专属定制版云手机&#xff0c;内置游戏安装包&#xff0c;不需要重…

【c++实现】统计上升四元组

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1. 题目描述2. 解释3. DP前缀和枚举 1. 题目描…

使用 nvm 管理 node 版本:如何在 macOS 和 Windows 上安装使用nvm

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、nvm的安装与基本使用2.1 macOS安装nvm2.1.1 使用 curl 安装2.1.2 使用 Homebrew 安装 2.2 Windows安装nvm2.2.1 下载 nvm-windows2.2.2 安装 nvm-windows 2.3 安装node2.4 切换node版本 三、常见问题及解决方案…

graphQL 参数使用报错问题

query{getMembers(sid:0,nodeId:"ns6;i7896"){methods} } //报错 "message": "Field \"methods\" of type \"[UaMethod]\" must have a selection of subfields. Did you mean \"methods { ... }\"?",这个错误信…