Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
84 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。) v( D" X1 e2 ^- c; Y- t. ~: w+ ?

6 d& D( D8 s5 d5 mThere 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.# T; r' P/ F* R$ B8 ?; }' t6 W& @
https://stackoverflow.com/a/37670490/7218912
3 V; \1 o; ^9 Q+ l7 G: h
# ?" v+ {6 ?  j! V, F3 @  X3 _
有时候确实有需要向智能合约转账:( x, h# `% y& g: J' i6 Z
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    % N4 L6 R0 W3 \) k
    7 O. E# M0 }8 c( x5 u* ], W! ~8 o& p
    但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。4 S6 [: Q0 n5 f3 q9 C7 p: f8 T
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    " u$ C+ _  E) F% h( S1 L7 U' F5 \这些 token 都都都都销毁了 (⊙?⊙)
    1 C) x2 Q( L1 K# X0 X, p  C$ q
    ( K7 Q6 r& V# t, ^4 }( F# KDexaran 认识到了这个问题,
    ( k# b8 k1 @8 y1 Q2 u2 {4 h8 n- _
    0 r" S! g0 j( H" BContracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.
    6 ^7 \( r' N6 t' a# ^% CERC20 token standard issues.(google docs)8 l1 V, n- K8 c; X) O
    & b  C- J: w$ ], |# O7 o
    并在 github 创建了一个 issue。
    $ I' T6 U0 k1 n; x7 f8 ItokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。  _2 }, d# L) [1 Z
    contract ERC223 {
    ( e3 {& \6 T2 R' Z$ _6 f7 c; y" Y  function transfer(address to, uint value, bytes data) {
    4 S3 Q. X; T8 p) _  K& Z        uint codeLength;
    8 z: S' ?/ g- p$ G" k, i; U        assembly {3 z2 `6 |& T5 L& b/ `: k  W/ g
                codeLength := extcodesize(_to)
    * t7 I- M6 T* H        }
    7 K, C' D; X% Q! ]        balances[msg.sender] = balances[msg.sender].sub(_value);( h$ B3 l0 p' v9 u
            balances[_to] = balances[_to].add(_value);
    + f$ S7 {  W% @. q% |        if(codeLength>0) {) B. e: g) ]+ Z  i
                // Require proper transaction handling." q* }/ n% p1 W# R3 ?
                ERC223Receiver receiver = ERC223Receiver(_to);7 s3 K, T9 B7 K# i
                receiver.tokenFallback(msg.sender, _value, _data);9 Y& E* h- j6 A4 {7 X4 Z* e% s
            }
    : k; B' f/ a9 B. S4 k2 ^- c    }
    3 w& b/ L% i6 g" ?% S' x}
    % G: _; @; H* J【todo】:代码解释; w8 X3 ^& f( Z: s) ~+ s

    : S' T0 j2 _4 |The biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.
    8 y6 |% u+ Y! u7 g+ }' `https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    % j$ B5 i3 E1 x
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13