Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
83 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。
$ w  T0 k) `& I$ l: B1 f3 P9 K+ z" f- M" P: W
There is no way in solidity to check if an address is a contract. One of the goals of Ethereum is for humans and smart contracts to both be treated equally.' O' ^0 {% @9 K) l$ }
https://stackoverflow.com/a/37670490/7218912
4 ]0 O2 G: W( Y; ^
2 ]# N$ P8 o1 P1 o1 u
有时候确实有需要向智能合约转账:
4 Y3 t' y% _2 Q% W2 Q& m
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    3 D! C1 N5 h9 T1 ]$ O- |+ o
    5 W) G+ M7 K. F: j
    但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。8 H: R" w- M+ ^( q8 N
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    ( y1 H8 E7 B& o$ m; t这些 token 都都都都销毁了 (⊙?⊙)  F: i5 P# x1 I6 i

    7 h1 t" d  |  BDexaran 认识到了这个问题,
    ' }, j; B# X  q& L- s( y3 Y! {2 Z  H8 f7 w/ L9 k
    Contracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.- F- k2 l$ g# K' k
    ERC20 token standard issues.(google docs)+ _8 F" V. N' Z& K
    * z3 t: `% A! @% Z* u% ?: s
    并在 github 创建了一个 issue。
    0 T0 n/ z' W7 a: u: z1 AtokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    : h- O' m4 L5 Y$ pcontract ERC223 {$ k. o5 B  M' s6 B: W) Q( U
      function transfer(address to, uint value, bytes data) {
      s4 W& e6 y' D* Z) ~- j: X: I        uint codeLength;
    9 T& a5 l% Z; w7 M        assembly {8 ^) I# _- S: |7 M  s/ ~
                codeLength := extcodesize(_to)6 C9 k7 x  q' K
            }  f" D( W8 B7 q6 g: j- {
            balances[msg.sender] = balances[msg.sender].sub(_value);
    3 r5 ~. J4 H# c6 `4 l        balances[_to] = balances[_to].add(_value);
    * m1 Q7 @7 H0 \        if(codeLength>0) {2 F% f8 Y$ t2 B8 t, o5 k& M
                // Require proper transaction handling.
    ! E; n5 e4 f$ i9 L0 j( b* v            ERC223Receiver receiver = ERC223Receiver(_to);# J6 Y6 C* W0 A9 c
                receiver.tokenFallback(msg.sender, _value, _data);" g" ]" ^7 _- C5 S( q  c* b
            }% m2 F3 A. E( j
        }
    ( d; \5 s$ N) f; y}, }& n6 p* [0 i2 j
    【todo】:代码解释
    % h& }  s2 E, a( ~
    $ H4 b4 C$ \9 P$ R0 K$ T# CThe biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.
    ! i# y6 Z& W8 l8 i8 a+ ?https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    # u; s5 c# k2 ]3 l, K6 Y
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

    杨小公子君莫邪 初中生
    • 粉丝

      0

    • 关注

      0

    • 主题

      13