Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
82 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。
4 P! b; C. S$ s1 S, x( y
" a1 }, i' {+ }0 |' Q$ N" k/ pThere 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." y* C0 d+ d; W. f! F. v+ f
https://stackoverflow.com/a/37670490/7218912
1 q1 p+ ~  e: @4 b& i! H' [
, V# u7 H, T- J1 l% q' F$ }  F
有时候确实有需要向智能合约转账:! G$ m+ O) l  F3 F, M5 H/ [
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;: Y: E1 s# C( w  }& `2 c/ U* V. p1 c' X

    3 Y+ M5 y3 G* @( C' m但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。# [" M. h+ @" x
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。. \3 T* d  h% Y& W8 u& M0 w
    这些 token 都都都都销毁了 (⊙?⊙)  }: Z( O3 Y9 _0 D+ O
    4 s2 g! h* C2 a" c/ C1 [9 H4 s
    Dexaran 认识到了这个问题,
    5 C$ y# s! B- c1 w
    6 c3 a/ I5 B, V/ X- QContracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.  g  T" d4 f0 J9 r  D$ g  d
    ERC20 token standard issues.(google docs)+ a- T1 a" p( \, g# o" |# T

    - J* h; s+ ?3 T, _; T并在 github 创建了一个 issue。
    - C& N, g8 T8 e4 JtokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    + j/ |: ?$ Y0 X4 ycontract ERC223 {) w4 f( a; \" R/ W$ K
      function transfer(address to, uint value, bytes data) {
    6 t9 I, D/ X  k        uint codeLength;9 r" V6 Y. V: p3 {$ Q9 \, }& c
            assembly {
    3 b7 n  X( R1 Y- {3 b# Y            codeLength := extcodesize(_to)7 i; O$ I- S) X, B4 y. R0 a: E; e1 U
            }
    ( m3 R1 A( s3 Y6 O& N# g        balances[msg.sender] = balances[msg.sender].sub(_value);
    ) T# V1 N* h, Z0 f7 G        balances[_to] = balances[_to].add(_value);- X& \! ]5 D. b: `" k: a
            if(codeLength>0) {
    $ o6 A* P& k- h& s: P1 i            // Require proper transaction handling.
    # s/ r- ~+ B% r4 I$ K            ERC223Receiver receiver = ERC223Receiver(_to);+ I. E8 E$ I1 m; f7 R$ s3 b+ t7 @
                receiver.tokenFallback(msg.sender, _value, _data);
    - D: `) e( D" E0 q* x        }' L- ?4 s1 D& C" U9 ^2 A
        }
    / E5 D( x; L; S, I}4 V. X. f. [( O$ s: T9 M* ]
    【todo】:代码解释
    ) ]* b3 n0 W  `, r- T
    8 p  Z: `% Q2 F( H3 i0 \The biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.* W* @1 {1 [  L, X; w3 D. I
    https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a& X! A$ I, U8 E5 i" K
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13