Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
149 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。1 [+ q  }- ^2 k  n& F

+ p, }0 W' [, z/ @3 `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.2 ^3 B; b8 n( f9 h$ [  s* W' ^
https://stackoverflow.com/a/37670490/7218912
* ]& D$ n: p# T
/ l! A, K) D3 y  T/ u/ s6 T
有时候确实有需要向智能合约转账:
/ N/ Q6 z7 i9 r
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    . X9 F( y( o& E5 X2 o
    - M" k" ^$ ^; L6 g
    但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。' Q9 q  A- E* U1 t; t
    当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    2 R& z" ~) B/ |' ~这些 token 都都都都销毁了 (⊙?⊙)
    , Q! C" i; ]# t. e8 Y8 s% d" ~+ w8 H5 w
    Dexaran 认识到了这个问题,
    9 s" s8 c: G( ^+ ^8 h1 |
    ' n: U: B6 B+ ^( Y3 [Contracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.
    : y. Q9 W0 l, j  c1 f; RERC20 token standard issues.(google docs), O/ C/ K# c" p  {/ Y
    ; ~6 T5 d* q4 e3 `
    并在 github 创建了一个 issue。5 |  R' K0 j1 H; S5 [
    tokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    9 h& F0 d3 T6 z* ?$ D. {2 scontract ERC223 {
    : W* ]! @4 O& p6 n& {; l  function transfer(address to, uint value, bytes data) {* a4 m4 @* |' b2 _  ?( O% g* L6 a5 W* m
            uint codeLength;
    ' ]5 \" [2 B) X1 u3 P8 I        assembly {
    , S: X7 }# j4 J+ Y6 j, _1 @            codeLength := extcodesize(_to)* f/ u# {- X. |6 o  E5 p
            }
    3 d" |6 E1 e$ e        balances[msg.sender] = balances[msg.sender].sub(_value);
    2 W' Y" |$ h$ d. ], G$ j2 N2 V        balances[_to] = balances[_to].add(_value);9 F/ u8 `$ ^7 S5 j) ]
            if(codeLength>0) {
    3 e' s! N2 D( h1 s4 S; _            // Require proper transaction handling.4 G( W* j. b9 k8 m+ ~; T. T4 a
                ERC223Receiver receiver = ERC223Receiver(_to);
    ! Q& J6 U; N( Q$ x  @1 N; f            receiver.tokenFallback(msg.sender, _value, _data);, z0 y4 k( }. f
            }5 e, P. E; ]+ K% B6 V
        }7 U7 l* v, ~0 ]% B) F4 i
    }1 ?, x/ B" Q5 T: H6 W+ T
    【todo】:代码解释. y0 n" y7 A! T1 b
    ) Z) L1 g4 s  s* F8 B
    The biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.
    - ]. t; |) r+ e" @* m5 Xhttps://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    ) W  Z; G! y% X* ]+ c0 y4 S
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13