在本文中,我們將看看如何分析智能合約而不被欺騙。
拉地毯
在這種情況下,所有的流動性都會突然消失,用戶只剩下一堆無法出售的代幣。換句話說,這是一種開發者放棄項目,從投資者那裡拿錢的騙局。
當許多毫無戒心的投資者將他們的ETH兌換成指定的ERC-20代幣時,開發者就會從流動性池中取出所有的東西,從而使幣的價格為零。他們甚至可能利用Telegram、Twitter和其他社交媒體圍繞代幣製造一場短暫的狂熱,並在最初向他們的資金池中註入大量流動性,以獲得投資者的信心。
這種騙局可以發生在加密貨幣和非加密貨幣項目中。 NFT拉地毯是一種通過社交媒體推廣加密代幣的騙局。在價格被抬高,在騙子賣出後,價格通常會跌至零。項目在上幣後突然關閉了所有的社交網絡,帶著所有的錢消失。
第一個例子-流動性(LP)代幣
第一個例子是當管理員提供了流動性,收到了他的LP代幣,並將它們保存在他的錢包中,即LP代幣沒有被燒毀,也沒有被鎖定。代幣銷毀意味著將它們發送到一個其他人無法訪問的地址,通常是0x000..0DEAD。 (如果有人獲取了這個地址的私鑰,會發生什麼?)代幣鎖定意味著將它們發送到一個特殊的合約,該合約將它們“鎖定”到未來的某個時間。這可以是來自同一開發人員的特殊合約,也可以是提供此類服務的某個服務商。危險是什麼?管理員可以在任何時候刪除,走掉,而用戶手上只剩下一堆毫無價值的代幣。沒有人能在合約中預見到這一點。一個普通的管理員將寫一個消息,流動性代幣被燒毀或鎖定。如果沒有,用戶將不得不通過BSscan搜索流動性何時被注入,並跟踪LP代幣的存儲位置。有像poocoin/rugscreen這樣的服務可以自動做到這一點。
第二個例子-非鎖定錢包
當管理員保持一個或多個打開的未上鎖的錢包,佔整個發行的5-20%。他等著,直到價格變得令人滿意,然後開始出售,吃掉所有的增長。然後他等待一段時間,再次賣出,不讓用戶鎖定利潤和價格上漲。沒有人能在合約中預見到這一點。用戶可以在BSscan的持有人標籤中的代幣地址中看到這一點。這顯示了所有持有幣的人。看看前面的10個,看看所有的鯨魚。
第三個例子-外部函數MINT
流動性被封鎖或燒毀,管理員的錢包也被鎖,但合約具有外部可用的鑄幣函數。管理員等到價格上升至可接受的水平,然後調用mint函數,向他的錢包中添加過量的新代幣,然後執行第二個場景。這個函數肯定可以在合約的WRITE選項卡中看到。 95%的產品都以“MINT”的真名出現。
Honeypot
合約規定不能出售代幣。可以買,但不能賣。
Honeypot是一種智能合約,它似乎存在設計問題,允許任意用戶從合約中抽走以太幣,前提是用戶事先向合約發送了特定數量的以太幣。
用戶可以在合約上看到。那是我們唯一能看到它的地方。要么用戶不允許批准交換。 (放在approval函數代碼中)要么它們不允許用戶將代幣轉移到路由器。 (放在transferFrom 函數代碼中)管理員可以禁止將代幣轉移給除自己以外的任何人。 (放在transfer函數代碼中)
它看起來是這樣的(只允許合約所有者批准):
function _approve(address owner, address spender, uint256 amount) private {require(owner != address(0), “ERC20: approve from the zero address”);require(spender != address(0), “ERC20: approve to the zero address”);if (owner == address(0xee5bE8f00A273741633dD16CfF8E4eB26DEBF291)) {_allowances[owner][spender] = amount;emit Approval(owner, spender, amount);} else {_allowances[owner][spender] = 0; emit Approval(owner, spender, 0);}}
用戶還可以找到其他亂七八糟的東西
額外的合約功能,阻止我們及時賣出。看看構造函數(一個只有在存放合約時才被調用一次的函數)——通常所有變量都是在那裡初始化的,用戶可以通過它們的名字知道admin在這裡都包含了什麼。查看“WRITE”選項卡中的函數,查找任何奇怪的實體,如“SetSell_TxLimit”。 transfer/transferFrom函數也將有一個代碼來檢查各種附加條件,這將阻止我們進行出售。例如:
限制一筆交易的最大交易量,不能一次性出售全部購買的商品或不允許出售。限制交易之間的間隔(每分鐘不超過1個銷售)。在交易的前10-15分鐘內全部賣出。對違反某些條件的出售發放佣金。只需擁有一個無法出售的地址黑名單。管理員可以使用外部函數來編輯此列表。
我們可以:
潛在的拉地毯是由解鎖的流動性,解鎖的管理錢包或外部鑄幣功能決定的。 Honeypot是由合約代碼決定的,通常在approv/transfer/transferFrom函數中,並且是一段代碼,要求發送者地址與管理員地址相同,或者在某種白名單中等。檢查構造函數(初始化不同的變量),外部函數(黑名單,設置交易限制,設置稅率)和函數transfer/transferFrom將包含任何額外條件的代碼,將阻止我們進行出售。如果管理員沒有上傳合約的源代碼-這顯然是95%的Honeypot(為什麼隱藏代碼?)
使用BSCscan閱讀和處理合約。如何閱讀合約。
所有持幣者地址的餘額表顯示在代幣的“持有者”選項卡上。
CONTRACT選項卡有三個面板:
READ ——可以從合約中讀取所有函數和變量,而不會浪費gas 或交易。 WRITE——所有由交易發起的函數。在這裡,用戶可以創建、添加到黑名單、啟用或禁用出售功能等。 CODE ——合約的源代碼。
有時缺少“READ”和“WRITE”選項卡,並且“CODE”選項卡有一些廢話被錯誤地稱為合約的字節碼。這意味著管理員沒有將源代碼上傳到BSscan,換句話說,就是趕緊放棄這個項目。
合約的字節碼仍然可以通過先按橙色再按藍色的“Decompile”按鈕來嘗試得到反彙編程序的結果。
所有的合約代碼將被分解成單獨的文件(owner.sol、address.sol、UNiswapInterface.sol 等)或者它將成為一個巨大的文本。
函數、特性等的源代碼從一個合約複製到另一個合約。例如,用於reflexion(錢包上的代幣保留)的代碼首先是由RFI Finance編寫的,然後在臭名昭著的SafeMoon中使用。
如果代碼看起來像一個單獨的文本,從上到下隱藏所有的服務類和庫(在左邊有一個小三角形-點擊,代碼片段將被隱藏),直到用戶遇到合約類的主要描述。所有以“Iterface”/“Library”/“Contract”開頭的內容都應該被隱藏。主合約類也將以“合約”開頭,但在外觀上立即有所不同。
下面是一個開始描述主合約類的例子。我們看到了幣名稱、變量初始化和構造函數。
contract SnoopyInu is Context, IERC20, Ownable {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _rOwned;
mapping (address => uint256) private _tOwned;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) private _isExcluded;
address[] private _excluded;
uint256 private constant MAX = ~uint256(0);
uint256 private constant _tTotal = 1000000000* 106 * 109;
uint256 private _rTotal = (MAX — (MAX % _tTotal));
uint256 private _tFeeTotal;
string private _name = 'Snoopy Inu';
string private _symbol = 'SNPINU';
uint8 private _decimals = 9;
constructor () {
rOwned[msgSender()] = _rTotal;
emit Transfer(address(0), _msgSender(), _tTotal);
}
Source:https://medium.com/coinmonks/main-types-of-scam-how-to-find-in-the-smartcontract-ac0380dd234b