Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
80 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。- W3 A4 @# \- J* f% t

2 `! ^. o9 G3 c* k/ B3 @$ NThere 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.2 ]/ g1 t" V- U) B- K
https://stackoverflow.com/a/37670490/72189121 J' ?# D. u0 `7 S
# U6 F3 I8 v# g' T2 W; n3 l
有时候确实有需要向智能合约转账:) u3 ]# f/ N! }: \$ w
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    ; U. a" o7 H* y" ?( @% c: J

    $ }$ `$ t% p' E; Q但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。8 C2 S) N/ P* ^3 K, `
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    0 L8 Q: E- t$ H9 l5 r- e! a' J这些 token 都都都都销毁了 (⊙?⊙)
    " n# T" v+ i1 N5 b% E8 {+ v
      n7 `3 e9 Y8 MDexaran 认识到了这个问题,
      G7 |2 J8 s& S" \
    9 m5 `6 ^# s# P* N( O( lContracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.2 k/ f, h' T5 G3 W& ^
    ERC20 token standard issues.(google docs)3 J6 y; I1 W% S2 M! o% X( q

    ) u8 a) D2 w: d6 ?5 H6 g并在 github 创建了一个 issue。
    / I) u( C% Z' T  @/ g$ ftokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    ( \6 F' x# G  r% Zcontract ERC223 {/ N9 a# ?" c1 `" }
      function transfer(address to, uint value, bytes data) {, b7 c9 N/ m7 P6 f
            uint codeLength;- [2 E4 W1 L) G3 Q( D
            assembly {
    $ l3 y7 `8 r! N3 y9 G( @            codeLength := extcodesize(_to)
    4 `1 ?- z( T2 K/ x5 q        }
    0 j- I0 T3 f& ^6 B$ _: Z        balances[msg.sender] = balances[msg.sender].sub(_value);. |6 v8 I  x) @# F6 O1 O
            balances[_to] = balances[_to].add(_value);* @! O$ m7 N# U& E( T6 a! @- }
            if(codeLength>0) {
    . Y$ @' U! Y$ W; Z            // Require proper transaction handling.# P% H5 `1 d# S- P0 U/ V" l
                ERC223Receiver receiver = ERC223Receiver(_to);
    ! ?6 k! ?, m) P& [; h& t            receiver.tokenFallback(msg.sender, _value, _data);+ V) I7 v/ N/ I6 h
            }
    + A- S4 W5 a$ v6 m; ^! v& r    }2 R9 |4 f7 A* X' h
    }
    ' y2 _! j% E: y% n【todo】:代码解释
    8 n- V3 [( c5 A9 O/ T+ T( u
    + v% V9 F+ k! F- o. O4 i& GThe biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.5 U7 o! l& b* d$ m, c  S
    https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a0 H9 z: z8 {8 N, C
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13