Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
81 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。; u1 ]. p+ Q" u. |; t

6 Z% F( a4 l$ M5 }, UThere 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./ e2 c  K/ ]+ J* T7 j; b" A8 N
https://stackoverflow.com/a/37670490/7218912& U6 i8 `7 ]: w' ]) D; S
6 G( Q2 t& W( }$ |0 e( L4 q, G
有时候确实有需要向智能合约转账:
4 o* [% U: Q" S& r3 F
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    7 l0 c0 J% ^! M# a" R1 q4 w( m6 |

    5 Z3 z4 m: Q" d但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。
    $ V* n5 J$ @2 I当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。8 H% x. O& v6 _2 I
    这些 token 都都都都销毁了 (⊙?⊙)
    1 ?5 B4 q" L2 K& X! z
    : R2 }+ D, _. Q+ y, |2 uDexaran 认识到了这个问题,: B- M! E7 v2 |3 ~! }8 v
    8 E  E- T- T9 a5 r9 S% F, J
    Contracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.: ]3 L$ p% K3 j) ]( K7 g, j. s
    ERC20 token standard issues.(google docs)
    9 e4 {: u# E' _$ H

    ' h. L% M/ U+ P' r; g3 X并在 github 创建了一个 issue。
    % F6 e% h( [8 m# }tokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    ! _2 C+ y6 |2 n9 {9 ]contract ERC223 {
    / X- @5 f4 d1 F  function transfer(address to, uint value, bytes data) {
    . m9 \; q# }- x0 V7 q        uint codeLength;. F8 F- V/ m# l1 h, h' m
            assembly {
    5 g+ y, G- Y2 o% i            codeLength := extcodesize(_to)
    % r& W7 Y5 X9 L+ n4 J1 l/ j; M        }% _/ y' E' C$ h+ Y, \( N& l3 l* Q( O
            balances[msg.sender] = balances[msg.sender].sub(_value);
    9 k2 `4 g6 }- v. \        balances[_to] = balances[_to].add(_value);
    5 I2 A4 l( Q; w9 @        if(codeLength>0) {0 v' j- |  x3 k+ ^9 M. s
                // Require proper transaction handling.
      Q7 O4 h  c" w8 P0 ]            ERC223Receiver receiver = ERC223Receiver(_to);# v, U" e: p# l% h2 o
                receiver.tokenFallback(msg.sender, _value, _data);
    % q# A2 w5 m2 q        }
    5 Q. p6 J, F9 r; w& Q7 _    }2 K! \. v5 ]  O, C3 D  n" z
    }
    2 }1 r% k7 @6 s' q8 k【todo】:代码解释: K( v* _" z8 z8 Z0 t, N9 _

    ; v) F5 l% f" Q1 t9 r9 U* _The biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.
      J5 m! K. Z5 E6 f, ahttps://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a6 A$ }4 W- N, n9 m1 }) C9 |3 o
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13