Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
170 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。' @6 ?( ]1 Y1 f* P2 B  [% Q- ~

3 z' ~3 [2 |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.
" T; g; h2 Q( k5 e" @+ {https://stackoverflow.com/a/37670490/7218912
2 v( Z! \, Y* q- A* @8 [
% K, `5 i6 ?' S1 l0 }
有时候确实有需要向智能合约转账:$ n, ~9 ?( x6 p# C5 i; s
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;
    7 S, j6 J- Z" u$ o2 L9 n! `6 z9 `

    : W# L3 b$ b1 S! I1 s但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。
    9 o' X! Y6 l1 H/ t$ c4 W当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。
    5 z5 R, C5 ^7 O2 e& |+ S这些 token 都都都都销毁了 (⊙?⊙)2 |3 i$ g; V" @0 o; h; `

    5 c7 [9 n5 z# |0 ]9 UDexaran 认识到了这个问题,3 m! ?3 X/ `: O4 w
    + @& B# U0 J- I1 `4 E: e& J
    Contracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.- r! b8 w2 z3 J4 r% m) d2 c
    ERC20 token standard issues.(google docs)
    1 G$ ?) M& Z' I& m; T( o& ~
    5 H+ T+ |6 R* ~' Z$ M/ q3 n
    并在 github 创建了一个 issue。
    1 ]& ], |3 `) n4 itokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    ! D8 }! j# a3 {. G7 s0 b' q; Qcontract ERC223 {# f7 ]) e6 m8 K1 o' z2 u. Z+ u6 I
      function transfer(address to, uint value, bytes data) {
    3 h' i/ r  d, ^% b3 Q( U        uint codeLength;
    ! w0 M. u1 e; N) g; s$ K  F0 i        assembly {
    , t4 R$ o9 j- E            codeLength := extcodesize(_to)$ J& i& L* j/ s! T7 e  ?
            }3 B' |3 h. Y8 K7 P( v2 k
            balances[msg.sender] = balances[msg.sender].sub(_value);/ S8 J6 O/ Y& G* X( U. b2 Q  T
            balances[_to] = balances[_to].add(_value);
    7 c* H5 p6 Z# B        if(codeLength>0) {
    3 t! S+ H1 R2 |- d; e: S! r7 J) T            // Require proper transaction handling.
    , n! \( o# b! g: \8 b            ERC223Receiver receiver = ERC223Receiver(_to);
    & d3 E( F7 v  l2 x2 I            receiver.tokenFallback(msg.sender, _value, _data);
    ( z, o2 ?0 }7 w( k) e- j* S        }4 ~* Z& _: N4 {( G" i1 F% e
        }
    7 q) Q6 `9 E5 Z, B' _  j}
    + |) U. _- h" r/ U- S/ x【todo】:代码解释
    6 N8 ]* y7 B/ H) Z# A" e! a  P* x
    , ?9 t  D0 g  i% n& RThe biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.9 R+ S6 B% I3 ^/ p* p1 W" d- F+ ?
    https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    " q3 `9 ~( ~) K9 C
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13