TRC10 TRC20 && 假币攻击

Posted by Thomas_Xu on 2022-11-24
author:Thomas_Xu

TRC10 TRC20 && 假币攻击

波场TRON的网络协议一共有两种,分别是TRC 10和TRC 20。

现在分开来讲一下TRC10和TRC20两种协议

TRC10

TRC 10是波场最初就拥有的网络协议,甚至早于波场主网上线,也正是因为如此,没有在虚拟机上运行的TRC 10成本较低,仅仅需要扣除一些带宽费即可,不会有其他任何费用,加上其代码开源,不会受到攻击或被滥用。

此外,TRC 10代币的易用性还比较高,可以在智能合约上实现自身交互,是传统代币与TRC 10代币之间的桥梁。TRC10继承了原有开发TRC代币的稳定性。

TRC20

TRC 20协议是由ERC 20转化而来,但是其具有更强的社区支持,不仅可以运行支持波场的智能合约,还能支持以太坊的智能合约,开发者可以轻松地把以太坊智能合约迁移到波场主网上来,灵活性更高,给了开发者更大的自由度。

特别是TRC 20协议还能形成对TRC 10协议的互补,可以实现TRC-10 协议所不能实现的额外逻辑,这让波场的网络协议得到了更大的能量释放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pragma solidity ^0.4.23;

/**
* @title TRC20 interface (compatible with ERC20 interface)
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
*/
interface ITRC20 {
function totalSupply() external view returns (uint256);

function balanceOf(address who) external view returns (uint256);

function allowance(address owner, address spender)
external view returns (uint256);

function transfer(address to, uint256 value) external returns (bool);

function approve(address spender, uint256 value)
external returns (bool);

function transferFrom(address from, address to, uint256 value)
external returns (bool);

event Transfer(
address indexed from,
address indexed to,
uint256 value
);

event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}

如上是TRC20的官方接口,其实可以看出来和ERC20没有本质上的区别。

假币攻击

假币攻击是由于接收代币时没有查验其tokenid是否为该代币的id,出现此漏洞主要是由于开发者没有足够了解波场合约代币机制的研究不足,可能套用了以太坊的token发行机制。

这是著名的BTT假币攻击事件。

经过分析发现,该假币漏洞是由于invest函数只判断了msg.tokenvalue,而没有判断msg.tokenid是否为真实BTT代币的ID:1002000所导致。

TRC10标准是波场本身支持的技术代币标准,标准规定了两个重要参数:msg.tokenvalue和msg.tokenid。其中msg.tokenvalue表示当前msg调用的代币数量,而msg.tokenid表示当前调用者使用的代币种类标记ID。每种TRC10标准的代币都有一个独一无二的标记ID作为代币种类证明。

这个invest函数如果放在以太坊当中,没有一点问题,但是在波场的token机制当中,这样写是有严重漏洞的,此invest函数没有对收到代币的资质(tokenid)进行检查,这导致攻击者可以自己发行一个通证,通过自己这个没有实际价值的token去调用invest函数,导致BTT合约误认为攻击者的FakeToken是具有价值的BTTToken


notice

true

This is copyright.

...

...

00:00
00:00