0%

TON 智能合约开发经验分享

合约包装

以下是前端 / 脚本侧对合约的调用逻辑封装

MainContractConfig.ts

import { Address, beginCell, Cell } from "@ton/core";

export type MainContractConfig = {
total_deposits: number;
owner_address: Address;
deposits: Cell | null;
};

/**
* 将给定的 `MainContractConfig` 对象转换为 `Cell`。
*
* 该函数接受一个配置对象,并将其属性(一个 32 位无符号整数和一个地址)存储到一个 `Cell` 中,
* 然后返回这个 `Cell`。
*
* @param {MainContractConfig} config - 包含要存储的数据的配置对象。该对象应包含以下属性:
* - `number` (number): 要作为 32 位无符号整数存储的数字。
* - `address` (Address): 要存储的地址。
*
* @returns {Cell} 返回存储了配置数据的 `Cell` 对象。
*
* @throws {Error} 如果输入的 `config` 无效或不符合预期结构,将抛出错误。
*/
export function mainContractConfigToCell(config: MainContractConfig): Cell {
return beginCell()
.storeUint(config.total_deposits, 32)
.storeAddress(config.owner_address)
.storeMaybeRef(config.deposits)
.endCell();
}
阅读全文 »

TON 智能合约开发经验分享

合约部分

注意:func 中注释使用 ;;

首先

  1. 定义的变量统一放顶部便于查阅和管理
  2. load_data()和save_data()成对出现而且需要严格对应
+-------------------+
| TVM 寄存器堆栈 |
+-------------------+
| C0: 执行代码 |
| C1: 参数 |
| C2: 返回地址 |
| C3: 上下文 |
| C4: 合约数据 🟡 | ← load_data() 从这里读
| | ← save_data(x) 会替换这里
| C5: 合约地址 |
| C6: 合约余额 |
| C7: 区块时间戳 |
| C8: 随机值 |
| C9: 消息体 |
| C10: 消息头 |
+-------------------+
阅读全文 »

接上文,开始我个人经历(2)之前请先在入门课程开始学习从Smart contract development lifecycle学习到Mastering FunC contracts coding跟着视频或者文档一步一步敲完事例代码。

接下来的内容默认你已经懂得了基本的func以及ton链的一些知识。
首先我们以一个简单银行合约为例子:
简单银行目标就是存款,利息计算,提取本金,领取利息,以及合约所有者特权(管理权限)
在产品的角度来看用户的旅程:

  1. 用户存款
  2. 合约自动计算利息
  3. 用户领取利息
  4. 用户提取本金

引子:因工作的原因接触Ton链的合约开发,遂埋头进入Ton链的学习,一个猛扎下去才发现水太深了

学习新技术肯定需要官方的文档:

  1. Ton的相关文档
  2. Ton的合约入门视频课程学习
    上述两个是我主要学习使用的文档

我的一个简单TON银行项目项目地址,后续的代码都在这个项目中。

接下来我阐述的是,我视角中如何理解和学习的过程:
首先,我具有evm链的合约开发经验和基础知识,那在TON链上很多东西完全不同可以说是一切都是新的,所以即使你没有接触过evm也没有关系。

阅读全文 »

场景1:没有依赖倒置的耦合代码

1. 定义具体的消息服务类

// services/EmailService.js
export default class EmailService {
send(to, message) {
console.log(`Sending email to ${to}: ${message}`);
}
}

// services/SMSService.js
export default class SMSService {
send(to, message) {
console.log(`Sending SMS to ${to}: ${message}`);
}
}

2. 在组件中直接依赖具体的服务

<!-- components/NotificationComponent.vue -->
<template>
<div>
<button @click="sendNotification">Send Notification</button>
</div>
</template>

<script setup>
// 直接引入具体的消息服务实现
import EmailService from '../services/EmailService';
// import SMSService from '../services/SMSService'; // 如果想使用 SMS 服务,需要手动修改这里

const emailService = new EmailService();
// const smsService = new SMSService(); // 如果要切换到 SMS 服务,需要手动创建实例

const sendNotification = () => {
emailService.send('user@example.com', 'Hello without Dependency Inversion!');
// smsService.send('123-456-7890', 'Hello via SMS!'); // 如果要使用 SMS 服务,需要手动修改这里
};
</script>
阅读全文 »

在开发过程中总是避免不了npm包源码不适配我们的需求,通常我们都是提pr或者fork本地改造。但是,有没有能在本地修改源码的方法呢?答案是有的 -- 本地补丁

首先在项目根目录新建patches文件夹之后输入

阅读全文 »

如标题所述,在经历过几个DEFI项目的开发后,对于区块链的一些应用开发有了一定的见解。
加之有数位志同道合的伙伴能一起完成各类的区块链项目开发,在几轮区块链开发过程中捕捉到的反馈就是用户体验永远是第一位的
正好吾辈一起的小团队对于前端设计与实现上有十分独到之处,希望能有机会与各位有需求之士通力合作!

微信(wechat): LK_Hanzo_Hasashi
电报(telegram): +1(402)665-0197

接上教程(1),此教程为无法通过官方提供的unlock.bin解锁的手机制作的。
还有一个事v409n也就是韩版v40可能存在无法开启fastboot模式
因为fastboot模式默认被download模式覆盖了所以想进入fastboot得先通过高通9008刷机模式下把abl_a.img 替换成v35.img(材料包里) 破坏掉开机的bootloader相关检索从而曲线进入fastboot模式。
bootloader解锁相关用的材料[https://pan.baidu.com/s/14RG4a2QTxZcGphfNagERUg](提取码: 24dn)

阅读全文 »

网购了一个洋垃圾 LGv40(v409n)韩版的 没有在大陆发售 cpu版本为高通骁龙845

此机基于aosp(安卓原生系统)所以存在很多不能用的地方比如ntp服务器是谷歌的也就导致没法自动获取时间这很蛋疼
加上谷歌真正的全家桶一堆谷歌的app往里手机里塞却不能卸载有点强迫症犯了,最蛋疼的是好几个韩文的应用我看了头都大,基于此我想把手机root玩玩 用比较流行的magisk注入然后pacth本系统的boot.img得到新的patched-boot.img 最后刷入手机获取root权限,话不多说开始。

阅读全文 »

有需要Telegram 机器人制作,推特博文抓取推送业务,以及短信推送业务的可以找我。。。
价格实惠,开发迅速