Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
171 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。  b! ~/ r; n7 A4 {# ?1 v- o: U) \

: q9 b1 y1 f+ y) Z; A1 q8 L/ O' E3 EThere 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.
  i( {# Y/ _# ]: a1 v( q" whttps://stackoverflow.com/a/37670490/7218912
. Z/ v  `' {1 R$ [' F

3 d$ C1 f! ~' Q0 h& p8 ^8 I有时候确实有需要向智能合约转账:
: A- k: `8 N- @
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;/ G0 u; `3 z; H  \8 \. u, D& Z

    " P6 u8 H' z8 ^+ k) }但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。! n# q' a6 q8 j& J; ?
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    ' `* b& d' ?3 |$ {9 J$ U这些 token 都都都都销毁了 (⊙?⊙)
    6 H% n) s8 s: Z* l. z
    : [& N, O, G* {: l! \$ I  \. UDexaran 认识到了这个问题,
    ! F3 y: _- l/ R' f% p, d0 g4 C( c' v' t/ U1 X  P+ H, \: j
    Contracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.
    ! o0 L4 e! @  [2 kERC20 token standard issues.(google docs)+ o3 ?  u3 s: R! W8 O# C( ]3 _6 q
    ! e) E, N0 m6 E2 |$ J3 q/ a
    并在 github 创建了一个 issue。
    7 o% D& j8 L: vtokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。6 y% J' Q: D, A2 ^) a( ]; a/ \" b
    contract ERC223 {/ x) e2 t3 d" O. ?
      function transfer(address to, uint value, bytes data) {
    4 k+ c# O2 B( V' h3 d* u9 `        uint codeLength;8 H; {2 K$ O: g- l1 p2 b8 |
            assembly {$ i, z+ e7 f  F9 Y7 J7 G: e
                codeLength := extcodesize(_to)6 {- d& ?$ l/ c$ r
            }  y# K# k% t( `
            balances[msg.sender] = balances[msg.sender].sub(_value);
    $ E1 F7 t) ~1 b9 @# u' s8 M        balances[_to] = balances[_to].add(_value);
    4 z: U* a1 V0 ~% j        if(codeLength>0) {
    - ^) v: q' p, e) ]! f9 f            // Require proper transaction handling.% ^% L1 ~6 Q, y5 `1 M
                ERC223Receiver receiver = ERC223Receiver(_to);0 a7 Q3 ]8 \( s$ z
                receiver.tokenFallback(msg.sender, _value, _data);+ Q- F, @9 U$ I! y6 i5 Q
            }. i, b' h9 p2 Y  u/ z
        }0 ?% g/ t: N! @' i; v
    }
    & X& Q+ [8 {4 C/ f; i% D* t" t  H3 e+ F【todo】:代码解释9 f% X# ~' C* z: |" S2 P

    6 t8 v" v, [( O6 w5 b( d  v# B8 E' bThe biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.
    - p7 Z+ }5 r) k' i. @https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    " ]+ g8 ~' O: c  Y# b
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13