如何通俗易懂的解释TON的智能合约
文章目录
- 一、小故事一则
- 二、Ton的智能合约在小故事中
- 三、python代码模拟
一、小故事一则
在一个遥远的国度里,有一个被魔法笼罩的小镇,这个小镇每年都会举办一场盛大的戏剧节。这个戏剧节不仅是演员们展示才华的舞台,更是他们交流心得、共同创作新剧目的盛会。
今年的戏剧节尤为特别,因为镇上的智者引入了一种新的魔法——“智能信箱”。每个演员都获得了一个这样的信箱,它能够接收来自观众和其他演员的信件。这些信件里装满了各种请求和信息,演员们需要根据信件内容来决定自己的下一步行动。
小镇的中心广场上,演员们忙碌地检查着自己的信箱,每当他们收到一封信,他们就会立刻进入角色,按照信中的指示表演。有时他们会回信给观众,感谢他们的支持;有时他们会向其他演员发出邀请,共同排练新的剧目。
随着戏剧节的进行,信件的数量越来越多,为了避免信件处理的混乱,小镇的智者决定将广场分成几个区域,每个区域都有自己的信箱管理人。这样,每个管理人只需要负责自己区域内的信件,大大提高了效率。
在戏剧节的最后一天,镇上的剧院上演了一部前所未有的互动剧目。观众们可以通过写信来影响剧情的发展,演员们则需要实时地根据信件内容来改变表演。这部剧目非常受欢迎,观众们的热情高涨,信件如雪花般飞来。
为了应对这突如其来的信件洪流,智者将剧院的工作区域一分为二,每个区域都有自己的信箱管理人。这样一来,即使是在剧目最高潮的部分,演员们也能够及时收到并处理观众们的信件,确保了剧目的顺利进行。
二、Ton的智能合约在小故事中
在TON区块链的奇妙世界里,智能合约就像是一个个独立的演员,它们在数字舞台上演绎着自己的剧本。每个演员都有自己的舞台(地址)、剧本(代码)、道具(数据)和金币(余额)。当观众(事件)向舞台投来一封信(消息),演员就会在灯光下(虚拟机)演绎剧本,回应观众的期待,可能会改变道具的摆放(更新状态)或者向其他演员发出邀请(发送消息)。
这个比喻中的“演员”对应于英文中的“smart contract”,它们是TON区块链上的独立实体,拥有自己的存储空间和行为逻辑。“舞台”则是指智能合约的“address”,它是合约在区块链上的唯一标识。“剧本”代表智能合约的“code”,它定义了合约的行为和功能。“道具”和“金币”则分别对应于智能合约的“data”和“balance”,它们是合约状态和资产的体现。
在这个戏剧节上,信件往来非常频繁,组织者决定将戏剧节划分为几个小舞台区域,每个区域都有自己的信箱管理(分片链)。这个比喻中的“小舞台区域”和“信箱管理”对应于英文中的“Shards”和“AccountChains”。在TON区块链中,为了提高处理效率,大量的账户和交易被组织成分片链,每个分片链处理一部分账户的交易。这样的设计使得每个分片可以独立处理交易,提高了整个系统的吞吐量。
如果某个区域的信箱管理太忙了,信件堆积如山,组织者就会决定把这个区域一分为二,让两个信箱管理来分担工作。这个比喻中的“动态分割策略”对应于英文中的“Dynamic splitting and merging of ShardChains”。在TON区块链中,如果某个分片链的交易量过大,可以将其分割成更小的分片链,以减轻单个分片的负担。相反,如果某些分片链的交易量较小,可以将其合并,以提高资源利用率。
戏剧节上的每位演员都可以给其他演员写信,组织者有一套高效的邮差系统(路由机制),确保每封信都能准确无误地送到收信人手中,而且按照寄出的时间顺序到达。这个比喻中的“邮差系统”对应于英文中的“special mechanism of routing”,它确保了智能合约之间的消息能够按照正确的顺序被送达。
在这个戏剧节上,有各种各样的信箱管理,每个都有自己的服务规则,就像不同的邮件服务商有不同的服务条款。这个比喻中的“信箱管理”和“服务规则”对应于英文中的“Workchain”和“rules of the group of Shardchains”。在TON区块链中,工作链是可以自定义规则的区块链,它们可以根据自己的需求来设定交易处理的规则。
最后,为了确保戏剧节上所有的信箱管理都能协调一致地工作,戏剧节设立了一个中心邮局(主链)。这个比喻中的“中心邮局”对应于英文中的“Masterchain”,它是TON区块链中的一个特殊链,用于同步所有分片链的状态,并确保整个系统能够达成共识。
通过这些比喻和对应的区块链概念,我们可以更直观地理解TON区块链的工作方式。每个智能合约都是一个独立的演员,它们在TON的舞台上演绎着自己的故事,通过消息传递与其他演员互动,共同构建了一个复杂而有序的区块链世界。
三、python代码模拟
基于上述故事,我们可以编写一个简化的Python代码来模拟TON区块链中的智能合约和账户链(AccountChain)的概念。请注意,这个代码只是一个模拟,并不代表真实的TON区块链实现。
class SmartContract:def __init__(self, address, code, data, balance):self.address = addressself.code = codeself.data = dataself.balance = balancedef receive_message(self, message):# 处理收到的消息print(f"Contract {self.address} received message: {message}")# 执行合约代码self.execute_code(message)def execute_code(self, message):# 根据合约代码逻辑处理消息# 这里只是一个示例,实际中会有复杂的逻辑print(f"Contract {self.address} is processing the message.")# 假设处理后更新了合约的状态self.data['last_message'] = messagedef send_message(self, recipient, message):# 发送消息给其他智能合约print(f"Contract {self.address} sends message to {recipient.address}: {message}")recipient.receive_message(message)class AccountChain:def __init__(self):self.transactions = []def add_transaction(self, tx):self.transactions.append(tx)print(f"Transaction added to AccountChain: {tx}")def process_transactions(self):for tx in self.transactions:print(f"Processing transaction: {tx}")# 这里模拟处理交易,实际中会有更复杂的逻辑tx['status'] = 'processed'# 创建两个智能合约实例
contract_a = SmartContract(address='A1', code='codeA', data={'last_message': None}, balance=1000)
contract_b = SmartContract(address='B2', code='codeB', data={'last_message': None}, balance=2000)# 创建账户链实例
account_chain = AccountChain()# 模拟合约A收到消息并处理
message = {'from': 'User1', 'content': 'Hello, Contract A!'}
contract_a.receive_message(message)# 模拟合约A向合约B发送消息
contract_a.send_message(contract_b, {'from': 'ContractA', 'content': 'Hi, Contract B!'})# 将交易添加到账户链
account_chain.add_transaction({'from': 'A1', 'to': 'B2', 'message': 'Hi, Contract B!'})# 处理账户链中的所有交易
account_chain.process_transactions()
在这个模拟中,SmartContract
类代表TON区块链中的智能合约,它有地址、代码、数据和余额。receive_message
方法模拟合约接收消息,execute_code
方法模拟合约执行其代码逻辑,send_message
方法模拟合约向其他合约发送消息。
AccountChain
类代表单个账户的交易链,它管理一系列的交易。add_transaction
方法将新交易添加到链中,process_transactions
方法模拟处理链中的所有交易。
这个代码只是一个非常简化的模拟,真实的TON区块链实现会涉及更多的技术细节,包括但不限于共识算法、网络通信、安全性和数据存储等。为了更深入地模拟TON区块链中的智能合约和账户链的概念,我们可以扩展之前的Python代码,增加一些更复杂的功能,比如模拟消息路由、交易批处理、以及智能合约之间的异步通信。以下是一个更详细的模拟示例:
import time
import jsonclass SmartContract:def __init__(self, address, code, data, balance):self.address = addressself.code = codeself.data = dataself.balance = balanceself.inbox = []self.outbox = []def receive_message(self, message):print(f"Contract {self.address} received message: {message}")self.inbox.append(message)self.process_incoming_messages()def process_incoming_messages(self):while self.inbox:message = self.inbox.pop(0)self.execute_code(message)def execute_code(self, message):print(f"Contract {self.address} is processing the message: {message}")# 模拟执行合约代码,这里只是打印消息内容if "transfer" in message:self.handle_transfer(message)def handle_transfer(self, message):recipient = message["transfer_to"]amount = message["amount"]self.balance -= amountprint(f"Contract {self.address} transfers {amount} to {recipient.address}")self.outbox.append({"to": recipient, "message": {"from": self.address, "amount": amount}})def send_message(self, recipient, message):print(f"Contract {self.address} sends message to {recipient.address}: {message}")recipient.receive_message(message)def process_outgoing_messages(self):while self.outbox:outgoing_message = self.outbox.pop(0)outgoing_message["to"].receive_message(outgoing_message["message"])class AccountChain:def __init__(self, shard_id):self.shard_id = shard_idself.transactions = []self.contracts = {}def add_contract(self, contract):self.contracts[contract.address] = contractdef add_transaction(self, tx):self.transactions.append(tx)print(f"Transaction added to Shard {self.shard_id}: {tx}")def process_transactions(self):for tx in self.transactions:contract = self.contracts.get(tx['from'], None)if contract:contract.receive_message(tx['message'])else:print(f"Contract {tx['from']} not found in Shard {self.shard_id}")self.transactions = []# 创建两个智能合约实例
contract_a = SmartContract(address='A1', code='codeA', data={'last_message': None}, balance=1000)
contract_b = SmartContract(address='B2', code='codeB', data={'last_message': None}, balance=2000)# 创建分片链实例
shard_chain = AccountChain(shard_id=1)# 将智能合约添加到分片链
shard_chain.add_contract(contract_a)
shard_chain.add_contract(contract_b)# 模拟合约A收到消息并处理
message = {'from': 'User1', 'content': 'Hello, Contract A!', 'transfer': 'B2', 'amount': 100}
shard_chain.add_transaction({'from': 'A1', 'to': 'B2', 'message': message})# 处理分片链中的所有交易
shard_chain.process_transactions()# 给合约一些时间来处理传出的消息
time.sleep(1)# 再次处理分片链中的所有交易
shard_chain.process_transactions()
在这个扩展的模拟中,我们为SmartContract
类添加了inbox
和outbox
来模拟合约的传入和传出消息队列。process_incoming_messages
方法用于处理传入消息,而process_outgoing_messages
方法用于处理传出消息。
我们还模拟了智能合约之间的资金转移。当合约A收到一个包含转账信息的消息时,它会调用handle_transfer
方法来处理转账,并将转账消息放入outbox
。
AccountChain
类现在包含了一个contracts
字典,用于存储分片链中的智能合约。process_transactions
方法会遍历所有交易,并调用相应合约的receive_message
方法来处理消息。
这个模拟展示了智能合约如何处理消息、执行代码、发送消息以及如何在分片链中批处理交易。请注
相关文章:

如何通俗易懂的解释TON的智能合约
文章目录 一、小故事一则二、Ton的智能合约在小故事中三、python代码模拟 一、小故事一则 在一个遥远的国度里,有一个被魔法笼罩的小镇,这个小镇每年都会举办一场盛大的戏剧节。这个戏剧节不仅是演员们展示才华的舞台,更是他们交流心得、共同…...

针对Docker容器的可视化管理工具—DockerUI
目录 ⛳️推荐 前言 1. 安装部署DockerUI 2. 安装cpolar内网穿透 3. 配置DockerUI公网访问地址 4. 公网远程访问DockerUI 5. 固定DockerUI公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...

五大注入攻击网络安全类型介绍
1. SQL注入(SQL Injection) SQL注入流程 1.1. 概述 SQL注入是最常见的注入攻击类型之一,攻击者通过在输入字段中插入恶意的SQL代码来改变原本的SQL逻辑或执行额外的SQL语句,来操控数据库执行未授权的操作(如拖库、获取…...

linux-L9.linux中对文件 按照时间排序 显示100 个
find . -type f -exec stat --format %Y %n {} | sort -nr | head -n 100解释: • find . -type f:在当前目录下查找所有文件。 • -exec stat --format ‘%Y %n’ {} :对每个找到的文件执行stat命令,以获取文件的修改时间&#…...

springboot从分层到解耦
注释很详细,直接上代码 三层架构 项目结构 源码: HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import com.amoorzheyu.service.HelloService; import com.amoorzheyu.service.impl.HelloServiceA; import o…...

网络视频流解码显示后花屏问题的分析
问题描述 rtp打包的ps视频流发送到客户端后显示花屏。 数据分析过程 1、用tcpdump抓包 tcpdump -i eth0 -vnn -w rtp.pcap 2、用wireshark提取rtp的payload 保存为record.h264文件 3、用vlc播放器播放 显示花屏 4、提取关键帧 用xxd命令将h264文件转为txt文件 xxd -p…...

MySQL 大量 IN 的查询优化
背景 (1)MySQL 8.0 版本 (2)业务中遇到大量 IN 的查询,例: SELECT id, username, icon FROM users WHERE id IN (123, 523, 1343, ...);其中 id 为主键,IN 的列表长度有 8000 多个 问题 …...

python运维
环境准备 安装python3环境 # centos 安装python3 yum install python3创建激活venv python3 -m venv .venv source .venv/bin/activatezookeeper pip install kazoo 递归复制目录 from kazoo.client import KazooClientdef copy_node(zk, source_path, destination_path)…...

gen_server补充基础学习
学习gen_server的回调结构 gen_server:start_link(Name, Mod, InitArgs, Opts)这个调用是所有事物的起点。它 会创建一个名为Name的通用服务器,回调模块是Mod,Opts则控制通用服务器的行为。在这里可以指定消息记录、函数调试和其他行为。通用服务器通过…...

Python 入门教程(3)基础知识 | 3.1、基础语法
文章目录 一、 基础语法1、缩进规则2、标识符3、多行语句 一、 基础语法 1、缩进规则 学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断。python 最具特色的就是用缩进来写模块。缩进的空白数量是可…...

git 合并分支并解决冲突
git 合并分支并解决冲突 切换分支 git checkout <branch-name> 首先切换到要合并的目标分支 合并分支 git merge <source-branch> //将源分支代码合并到当前分支中,源分支的各项新增的提交都会按时间点插入到当前分支的提交记录中 git merge …...

《程序猿之设计模式实战 · 装饰者模式》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

[K8S]Forbidden: pod updates may not change fields other than
背景 在执行kubectl apply -f pod-nginx.yaml的时候报错 The Pod "nginx-test" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds`, `spec.to…...

C/C++漏洞检测数据集汇总
漏洞检测这个方向最近几年尤为热门,尤其是与深度学习技术相结合的研究,同时一些公开可用的数据集的出现也进一步推动了这些技术的发展。本篇文章总结归纳了目前在 C/C 源代码漏洞检测方向的一些公开数据集以及相关文献。 1 Devign (FFmpegQemu) 简介&am…...

springboot后端开发-常见注解及其用途
文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中,有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…...

TypeScript 扩展
扩展 ?:可选参数 可选链事实上并不是TypeScript独有的特性,它是ES11(ES2020)中增加的特性 可选链使用可选链操作符 ? 作用是当对象的属性不存在时,会短路,直接返回undefined,如果存在,那么…...

按键学院往期视频
按键学院第五期 网游实战系列课程 按键学院第四期 网游实战系列课程01-回合制网游的特点:测试游戏后台按键图色 网游实战系列课程02-神武新手任务的识别与处理:字库识别任务 网游实战系列课程03-神武自动组队与攻击 网游实战系列课程04-神武自动逛地图与攻击 网游实战系列课程0…...

通信工程学习:什么是MRF多媒体资源功能、MRFC多媒体资源功能控制、MRFP多媒体资源功能处理
一、MRF多媒体资源功能 MRF(Multimedia Resource Function,多媒体资源功能)是3G/IMS网络中定义的提供多媒体资源功能的网络实体,它为3G/IMS网络的业务和承载提供媒体能力支持。MRF通过提供丰富的媒体处理功能,如播放声…...

【Windows】获取进程缓解策略设置情况
目录 一、前言 二、主要概念 三、实现步骤 四、总结 原文出处链接:[https://blog.csdn.net/qq_59075481/article/details/142234952] 一、前言 在现代操作系统中,进程缓解策略(Process Mitigation Policy)提供了一种防御机制…...

语音识别相关概念
声音如何保存成数字信号? 声音是听觉对声波产生的感知,而声波是一种在时间和振幅上连续的模拟量,本质是介质的振动,,比如空气的振动。那么只需要把这个振动信号记录下来,并用一串数字来表达振动信号振动的…...

Iceberg与SparkSQL查询操作整合
前言 spark操作iceberg之前先要配置spark catalogs,详情参考Iceberg与Spark整合环境配置。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。 使用SQL查询 查询的时候表要按照:catalog.数据库.表名的格式 SELECT * FROM prod.db.table; -- catalog: p…...

Linux 上安装 PostgreSQL
Linux 上安装 PostgreSQL PostgreSQL 是一款功能强大的开源关系数据库管理系统,因其稳定性、可扩展性和先进的功能而广受欢迎。在 Linux 系统上安装 PostgreSQL 是一个相对直接的过程,但具体步骤可能会因您使用的 Linux 发行版而异。本文将介绍在几种流行的 Linux 发行版上安…...

WRF-LES与PALM微尺度气象大涡模拟、PALM静态数据预备、PALM驱动数据预报、PALM模拟
查看原文>>>WRF-LES与PALM微尺度气象大涡模拟及ChatGPT在大气科学领域应用 针对微尺度气象的复杂性,大涡模拟(LES)提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟,这些过程往往与天气…...

需求分析概述
为什么要进行需求分析呢? 笑话:富翁娶妻 某富翁想要娶老婆,有三个人选,富翁给了三个女孩各一千元,请 她们把房间装满。第一个女孩买了很多棉花,装满房间的1/2。第 二个女孩买了很多气球,装满…...

Java | Leetcode Java题解之第391题完美矩形
题目: 题解: class Solution {public boolean isRectangleCover(int[][] rectangles) {long area 0;int minX rectangles[0][0], minY rectangles[0][1], maxX rectangles[0][2], maxY rectangles[0][3];Map<Point, Integer> cnt new HashM…...

java项目之基于web的人力资源管理系统的设计与实现(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于web的人力资源管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: …...

Linux 防火墙:iptables (二)
文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出(备份)所有表的规则导入(…...

小目标检测顶会新思路!最新成果刷爆遥感SOTA,参数小了18倍
遥感领域的小目标检测一直是个具有挑战性和趣味性的研究方向,同时也是顶会顶刊的常客。但不得不说,今年关于遥感小目标检测的研究热情尤其高涨,已经出现了很多非常优秀的成果。 比如SuperYOLO方法,通过融合多模态数据并执行高分辨…...

【Ubuntu】虚拟机安装USB摄像头ROS驱动 usb_cam(最新方法)
写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…...

免费的成绩查询微信小程序,让家长轻松掌握学生表现
传统的教学方式在不断地被革新。在成绩查询这一环节,老师们曾经面临着繁琐的手工操作和信息安全的风险。可现如今有一个让成绩查询变得轻松、高效且安全的新工具——易查分。 过去需要花费大量时间来整理成绩,然后通过短信或者打电话的方式告知给家长。以…...