欧易数字货币交易所 更快、更好、更强

欧易是世界领先的数字货币交易平台,你可以放心购买比特币、以太币、莱特币、狗狗币等数字货币,也可以探索Web3、投资DeFi 和NFT。欧易是您数字货币之旅的得力助手,下载欧易APP客户端安装包将助您轻松赚币.

hero thumb

初识TON:账号、Token、交易与资产安全

08,092024(UTC)LikeDislikeComment

By:Johan

背景

TON(TheOpenNetwork)是一个去中心化的区块链平台,由Telegram团队最初设计和开发。TON的目标是提供一个高性能和可扩展的区块链平台,以支持大规模的去中心化应用(DApps)和智能合约。

TON如此特殊,它是易用的,它与Telegram深度结合,使得普通人也能轻易使用代币;它又是复杂的,它与其他区块链有着截然不同的架构,而且使用非主流的FunC智能合约语言。今天我们从账号、Token、交易的角度讨论一下TON的特点及用户资产安全问题。

TON的特点账号生成

TON账号地址的生成方式与大多数区块链都不同,它是一个智能合约地址。首先,开局一个私钥,TON主要使用Ed25519算法生成公钥,生成流程如下:

这里有两种形式的公钥,一种是由私钥计算出的原始公钥,形如:

E39ECDA0A7B0C60A7107EC43967829DBE8BC356A49B9DFC6186B3EAC74B5477D

另一种是“美化”后的公钥,它携带了公钥的一些信息和校验位,形如:Pubjns2gp7DGCnEH7EOWeCnb6Lw1akm538YYaz6sdLVHfRB2

如果认为得到公钥就能像以太坊那样得到账号地址就太天真了,仅仅有用户的公钥还不足以计算出用户的账号地址。我们刚刚说了,用户的账号地址是一个智能合约地址,但是我们连账号都没有,怎么部署智能合约?正确的顺序是先计算地址,接收一点初始金额的代币,然后就可以部署合约。账号地址的计算过程如下图所示:

用户的地址也有多种形式,首先是原始形式,形如:

0:b4c1b2ede12aa76f4a44353944258bcc8f99e9c7c474711a152c78b43218e296

以及用户友好形式,形如:

Mainnet:Bounceable:EQC0wbLt4Sqnb0pENTlEJYvMj5npx8R0cRoVLHi0MhjilkPXNon-bounceable:UQC0wbLt4Sqnb0pENTlEJYvMj5npx8R0cRoVLHi0Mhjilh4STestnet:Bounceable:kQC0wbLt4Sqnb0pENTlEJYvMj5npx8R0cRoVLHi0MhjilvhdNon-bounceable:0QC0wbLt4Sqnb0pENTlEJYvMj5npx8R0cRoVLHi0MhjilqWY

细心观察这几个地址就可以看出,它们只有首尾几个字符存在差别,中间的`account_id`是一样的,但是我们还是无法看出公钥和账号地址之间的关系,其实玄机就藏在开头的`initialdata`中,它包含了一个用户的公钥,用户就是通过它掌握钱包合约的所有权。`workchainId`很好理解,TON并不是只有一条单链,它由非常多的分片组成,每个分片是整个网络的一部分,处理特定的一组账号和交易。为了定位和管理智能合约,需要明确指出它们位于哪个分片中。`Bounceable`和`Non-bounceable`有什么区别?这和智能合约的工作机制相关,我们先继续往下看。

钱包合约

以下是一个用户钱包合约的一段源代码,可以看到它在接收到用户的消息时读取了4个参数(stored_seqno,stored_subwallet,public_key,plugins):

wallet-v4-code.fc

()recv_external(slicein_msg)impure{varsignature=in_msg~load_bits(512);varcs=in_msg;var(subwallet_id,valid_until,msg_seqno)=(cs~load_uint(32),cs~load_uint(32),cs~load_uint(32));throw_if(36,valid_until