二舅币来了,二舅他跑了,相信今天你已经被这样的新闻刷屏了,那他真的跑路了吗?
二舅币来了,二舅他跑了,相信今天你已经被这样的新闻刷屏了,那他真的跑路了吗?
结论!所谓Twitter上安全专家发推,并引发无数媒体转发的二舅币,其实并没有跑路,并且在31号主动放弃项目管理员特权。
既然想辟谣就要有证据,笔者通过二舅币的智能合约源代码解读并结合链上交易记录的回溯,反证项目方的链上操作,带你分析本案原委。
先声明,我不是项目方,也完全不持有任何二舅币,本文仅从技术研究角度出发解读。
回溯这次新闻传播,始于Twitter上的某安全专家发推,进而被无数媒体转发,通过前后信息传播链路,最初的原文如下图:
其实就传谣角度来说,确实这样的行文非常仿真,描述专业数值惊人,并且Tornado Cash确实也是清洗赃款常见途径,但真是如此吗?130W美元的损失是怎么算出来的。 项目方自己也有所回应: 一开始,项目方还想通过空投,来对其推特粉丝做奖励来形成增粉的目的。
这么一看,似乎真像是即将跑路的样子。
此币部署在BSC币安智能链上并且做了开源验证,都可以通过下地址翻阅到若干证据。 区块链浏览器如何使用可见前文: 当我们在看Etherscan的时候,到底在看什么?
项目方地址: 0x469de2c6357666c69156722e83136ad1919a70aa 二舅币合约地址1 0x6e7ad49f67a9fa80d50f9659c3fc938296d68b58 二舅币合约地址2 0xe67cff48da0156e7978bc5a9a44d516a48d2a1d6
笔者从7.31号下午3点开始撰写本文,拉取到的二舅币链上交易共计1686条。 最初的部署操作的初始化环节,给项目方自己发了1,000,000,000,000,000个二舅币。
其部署时初始化的函数有较大的改动,多数与构建交易池的交互方法有关,不过核心产生资产并转移的部分如下部分代码中的_mint,等于是谁部署,就一次性mint出来给他。 说明:constructor 是合约的初始化函数,仅在合约部署时会被调用执行一次,后续无法执行。
constructor(若干参数){ ..若干代码
swapTokensAtAmount = totalSupply_.mul(2).div(10**6); // 0.002%
_mint(owner(), totalSupply_);
}
上来全给自己,越看越像Rug的前兆,也难怪别人要谣言你。。
但是发币是发币,得有交易所交易池进行不同币种兑换,才能转成跑路的其他资金,在区块链上发币并不难,5行代码就能发个币,别说100亿个代币,最高能给自己发10后面跟78个0的代币呢,因为标准ERC20对余额的存储类型是uint256,最大值为2**256次方。
那这个代币可以直接进行兑换吗?
源代码合计有3000行,不仅包含标准ERC20以及多数常见的配套插件等,还内嵌了对接交易池的兑换代码。 要跑路,就得有资金交互吧,
虽然二舅币在交易所中已经有大量的交易转移记录了(8K条),从而导致了现在二舅币合计拥有的地址达到1600多个。 但是如果要判断是否跑路,得看项目方发行时给自己持有的代币,有多少通过池子转换成其他代币。 追踪项目方给自己大规模发放的代币的记录,除了部署时给自己的1,000,000,000,000,000 就仅有上图中的第二行的转移操作,项目方将自己的990,000,000,000,000 个代币转入了0地址。
并且计算项目方自己地址的全部交易,可以看到仅有项目方通过pancakeSwapV2,用二舅币换到的1.3个BNB被转出。说明:当前BNB对美元价格为271美金一个BNB。
好家伙,为几百刀就跑路?? 所以为何会出现130W美金的说法呢? 盲猜一波,可能这个安全专家是以为转出的是1.3B 的美金?然后觉得太离谱就以为这个”B”不是billion(十亿)而是million(百万)? 当然,如今交易池池子总量里的代币占总量只有0.55%这倒是对的,因为项目方自己销毁了99%的代币。而他的销毁,并没有修改totalSupply (这确实不应该,他的销毁不是调用标准的Burn方法) 总是目前为止,确实可以说,项目方并没有从中恶意牟利到多少钱, 并且,项目方也对谣言发起方反问,也并没有得到回复。
在31号下午,项目方自己面对流言四起,也做了一个决定性的操作,即放弃项目方的管理员权限。
可以上面图中看到,项目方地址最后的两笔交易操作,即对二舅币的两个合约地址做了所有权转0的操作。 这样真的可以彻底如猴子NFT一样放弃新Mint权吗? 确实可以 放弃所有权执行的是renounceOwnership方法,会将_owner 设置0地址,而这样一来整个合约中,被用onlyOwner修饰过的方法均将无法调度使用了
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0)); // 调度下方函数修改新的管理员
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
而无法使用的函数大概有20个,而清除管理员权限最重要的是清除掉Mint出新的token的方法,整个3000行代码里,仅有_setBalance 是调度Mint权限的,当然虽然他没有出现onlyOwner 符号修饰他,是因为他是个internal的方法,这种外部无法调用,仅能被合约内已经定义好的方法调用
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
而对应会使用他的两个函数如下,很明显被onlyOwner 修饰,所以后续都将无法使用了。
function excludeFromDividends(address account) external onlyOwner {
function setBalance(address payable account, uint256 newBalance) external onlyOwner
我也进一步分析存储余额的_balances 变量是否有偷留后门来用其他的名字来做绕过,确实也没有发现,至于是否其他的后门,就仰赖高级合约审计大佬们出手了。
项目方确实没跑路,或许是造谣者恶意,或许是他的小编看到下跌以及项目方转走了1.3BNB以为是1.3Milion。 但是链上交易记录不会骗人,合约代码也不会骗人,代码里定义是如何,就不会有所变化。
引用:
安全专家发布: https://twitter.com/WhoCares_News/status/1552659993530609665
项目方回复: https://twitter.com/SecondUncle_Dao/status/1553621587697381376
二舅币合约部署交易: https://bscscan.com/tx/0xe51cf68ec605bbbce8f2784109faff98be9272824db8ebf5ad426fcfa1bca395
项目方得到1.3BNB: https://bscscan.com/tx/0x5c22ce9f185ad0907c08b60a9d36add51deed9b2b629527c48190bba0b2a5cdb
项目方转走1.3BNB: https://bscscan.com/tx/0xc3adb38d93c4b11b47f70a8af498dc114582392da80be8c6e7ee6783bd69b637
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!