幻想通過套利腳本躺著賺錢的懵懂青年竟然遭遇上了龐氏騙局
前情提要
一個月總有那么二十幾天不想努力了,于是乎心心念念想去搞個套利腳本,那樣他就可以自動套利,從此走上財富自由的人生道路。啊!話不多說直接開干,立馬在開始在谷歌上搜索致富秘訣,我可勁兒搜,在谷歌前列就看到了一篇文章( BNB Train Brings World’s first EVM Arbitrage Dapp on Binance Smart Chain ),它在給一個叫 BNB Train 的項目做推廣,簡單說就是他做了個套利 DAPP,你把錢給他,他幫你套利。
我的愿望就要實現了?!美妙人生我來啦!
于是乎我迫不及待地打開了它的官網,開始我的危險的致富之路。
相關信息
BNB Train 官網:https://bnbtrain.ognius.com/
官網所提供的合約地址:https://bscscan.com/address/0xEa9068C2ECa022A0D0133903D905FA2F4112ae77
一打開官網呀他就主動彈我的小狐貍,一看就很迫不及待的樣子。看來是等我這個知音等了很久了,等不及了都。但是我們不急,先不要輸密碼,先看看再說。保持優雅,不要著急,即使你很急,但是你別急。
合約分析
廢話不多說,先康康合約,啊只有一個合約文件,短短的 208 行。
首先看一下,合約版本 >= 0.8.0,沒有溢出風險,然后就是 Plan, Deposit 和 Player 三個結構體,啊這玩意不重要,過。
pragma solidity >=0.8.0;
struct Plan {
uint8 plan_days;
uint8 percent;
}
struct Deposit {
uint8 plan;
uint256 amount;
uint40 time;
}
struct Player {
address upline;
uint256 dividends;
uint256 match_bonus;
uint40 last_payout;
uint256 total_invested;
uint256 total_withdrawn;
uint256 total_match_bonus;
Deposit[] deposits;
uint256[5] structure;
}
然后就是一些合約的全局變量和 event ,隨便康康。
contract BNBTrain {
address public owner;
uint256 public invested;
uint256 public withdrawn;
uint256 public match_bonus;
uint8 constant BONUS_LINES_COUNT = 5;
uint16 constant PERCENT_DIVIDER = 1000;
uint8[BONUS_LINES_COUNT] public ref_bonuses = [50, 30, 20, 10, 5];
mapping(uint8 => Plan) public plans;
mapping(address => Player) public players;
event Upline(address indexed addr, address indexed upline, uint256 bonus);
event NewDeposit(address indexed addr, uint256 amount, uint8 plan);
event MatchPayout(address indexed addr, address indexed from, uint256 amount);
event Withdraw(address indexed addr, uint256 amount);
...
}
構造函數,設定一下 萬惡的 owner 以及利率。哦喲好奇怪的噢,你這個套利腳本定的還是固定利率的噢,搞得這么自信的嗷。
constructor() {
owner = msg.sender;
uint8 planPercent = 119;
for (uint8 duration = 7; duration <= 30; duration++) {
plans[duration] = Plan(duration, planPercent);
planPercent += 5;
}
}
然后我開始著急了,這么高的利率,存款函數在哪里,我要給你打錢,實現我的夢想,快,我已經迫不及待了,躺著賺錢的生活在向我招手,我已經想好在哪里買房了。
傳入你想存的計劃id _plan ,上線(推薦人)地址 _upline ,每次最少存入 0.01 BNB。
然后 payable(owner).transfer(msg.value / 10); 嗯?我剛存進來的錢你就要拿走十分之一?這不得是賺了錢以后你才從利潤中扣點么,哪有上來就把我本金給扣了的,有點不對勁了。
function deposit(uint8 _plan, address _upline) external payable {
require(plans[_plan].plan_days > 0, "Plan not found");
require(msg.value >= 0.01 ether, "Minimum deposit amount is 0.01 BNB");
Player storage player = players[msg.sender];
require(player.deposits.length < 100, "Max 100 deposits per address");
// 更新你的上線相關的信息,我只關心我自己,不管他
_setUpline(msg.sender, _upline, msg.value);
player.deposits.push(Deposit({
plan: _plan,
amount: msg.value,
time: uint40(block.timestamp)
}));
player.total_invested += msg.value;
invested += msg.value;
// 也還是處理你上線的函數,不重要,一點也不重要
_refPayout(msg.sender, msg.value);
payable(owner).transfer(msg.value / 10);
emit NewDeposit(msg.sender, msg.value, _plan);
}
那看完存錢,再看看取錢的情況唄,大丈夫能存能取。_payout 函數先更新一下你連本帶利能取多少錢。然后合約再從余額中把你應得的錢打給你。誒慢著,還記得我們調用 despoit 函數存錢的時候 owenr 扣了我們 10% 的本金嗎?直接取是余額不夠的,那么接下我們來看一下他的套利邏輯,看看它是如何賺錢的吧!
function withdraw() external {
Player storage player = players[msg.sender];
_payout(msg.sender);
require(player.dividends > 0 || player.match_bonus > 0, "Zero amount");
uint256 amount = player.dividends + player.match_bonus;
player.dividends = 0;
player.match_bonus = 0;
player.total_withdrawn += amount;
withdrawn += amount;
payable(msg.sender).transfer(amount);
emit Withdraw(msg.sender, amount);
}
function _payout(address _addr) private {
uint256 payout = this.payoutOf(_addr);
if(payout > 0) {
players[_addr].last_payout = uint40(block.timestamp);
players[_addr].dividends += payout;
}
}
function _refPayout(address _addr, uint256 _amount) private {
address up = players[_addr].upline;
for(uint8 i = 0; i < ref_bonuses.length; i++) {
if(up == address(0)) break;
uint256 bonus = _amount * ref_bonuses[i] / PERCENT_DIVIDER;
players[up].match_bonus += bonus;
players[up].total_match_bonus += bonus;
match_bonus += bonus;
emit MatchPayout(up, _addr, bonus);
up = players[up].upline;
}
}
啊,啊哈!很可惜200行代碼已經被我們分析的差不多了,合約中好像沒有,或者說壓根就沒打算準備套利的功能!上當了!這下子上了個大當了!什么躺著賺錢,都成泡沫,什么美好生活,剎那煙火。
這個合約做得呢,就是一個龐氏騙局。每進來一個人, owenr 就從他身上薅一筆(10%)。你要是能夠拉到人進來做你的下線呢,就給你點獎勵。后面來的人越來越多,那么先加入的人就可以套利成功,拿著自己的本金與利息成功離場。然后,后入場的人,就要靠后后入場人的錢來補這個窟窿,一直傳下去。
啊那我們可以回過頭來看一下之前被我們忽略掉的一些函數,關于上線的 _setUpline 函數,關于拉人頭分成的 _refPayout 函數,在這里就不詳細贅述了,夢想都破滅了還分析啥呀分析。
function _setUpline(address _addr, address _upline, uint256 _amount) private {
if(players[_addr].upline == address(0) && _addr != owner) {
if(players[_upline].deposits.length == 0) {
_upline = owner;
}
players[_addr].upline = _upline;
emit Upline(_addr, _upline, _amount / 100);
for(uint8 i = 0; i < BONUS_LINES_COUNT; i++) {
players[_upline].structure[i]++;
_upline = players[_upline].upline;
if(_upline == address(0)) break;
}
}
}
function _refPayout(address _addr, uint256 _amount) private {
address up = players[_addr].upline;
for(uint8 i = 0; i < ref_bonuses.length; i++) {
if(up == address(0)) break;
uint256 bonus = _amount * ref_bonuses[i] / PERCENT_DIVIDER;
players[up].match_bonus += bonus;
players[up].total_match_bonus += bonus;
match_bonus += bonus;
emit MatchPayout(up, _addr, bonus);
up = players[up].upline;
}
}
后記
官網拉到最下面還標了一個 Verified by BSC Scan 的字樣,也確實是上傳了自己的代碼嗷,即使是用套利作為羊頭騙騙你的。
怎么說,幻想破滅了,再琢磨琢磨點別的唄。然后也希望大家在趟各種 DeFi 的這渾水的時候能夠留個心眼,啊壞人很多的,都覬覦這你手里的這點銀兩呢。

浙公網安備 33010602011771號