在本文中,我们将看看如何分析智能合约而不被欺骗。

拉地毯

在这种情况下,所有的流动性都会突然消失,用户只剩下一堆无法出售的代币。换句话说,这是一种开发者放弃项目,从投资者那里拿钱的骗局。

当许多毫无戒心的投资者将他们的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