Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

ERC223: 防止转账黑洞

杨小公子君莫邪
142 0 0
以太坊的智能合约和普通用户的地址是被一样对待的,没法判断一个地址是智能合约还是普通用户。当你误操作向一个智能合约转账,就真的转过去了,然后 token 就丢了。0 Q. o& ~  B1 r9 P! l
: P! |1 v; U4 w1 s% z
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.3 N, _  L1 M( k$ d4 S
https://stackoverflow.com/a/37670490/7218912/ w; \- Y9 C  R2 W! o+ _
) ^) p) d& Q- z! Z
有时候确实有需要向智能合约转账:2 t( C# _+ Q0 u# S8 x( s: E6 a
  • 给智能合约转 Ether,作为 gas;
  • 比如向 bancor 的智能合约转 token 抵押在那里,转进去的 token 在卖出操作时会转出;. E! ]! L+ ]% u9 a3 k$ I- W

    + z- L" d6 r/ ]8 _, s6 a  D但是大多数 smart contract 的 token 是不能转出的,只要合约里没写转出的逻辑,就不能转出。以太坊将智能合约看做是独立的个体,没人知道它的私钥,给不支持转出的智能合约转 token 就等于销毁了。
    8 W( `6 b4 B* J" k当我们要转账时,会转到交易方的地址,不会闲着没事给智能合约转 token。但是这种事情仍然会发生,不断有人给 EOSTokenContract 转 EOS(见下图),EOSTokenContract 账户下现在有 154,834 EOS,价值 $1,176,738.4(价格 $7.6)。类似的,QtumTokenContract 账户下现在有 22,293 QTUM,价值 $158,280.3(价格 $7.1)。+ ^- ?$ Q: a3 o* u3 h4 W
    这些 token 都都都都销毁了 (⊙?⊙)
    ) S* M* Y& L" L' D( t2 t
    & d7 d  {; d0 r: N( kDexaran 认识到了这个问题,
    9 F, f% r" U1 S
    8 B" |4 M4 M& Y. [1 j' Y# m/ f7 yContracts that are not designed to work with tokens must reject incoming token transactions. Otherwise, each token becomes a potential token trap.
    5 ]- r$ M# ^# O6 |) p# @ERC20 token standard issues.(google docs)8 k3 p2 B. _4 |5 h! t
    / {6 @- x- U( f3 S
    并在 github 创建了一个 issue。
    0 T3 s' v& w* o/ Y" b5 K$ l  [tokenFallback 函数,当转账到不能转出的智能合约地址时,将自动取消。
    ; {/ Z7 A3 q9 C. C5 K  xcontract ERC223 {5 o- e5 c, f# q9 Z: l. v$ B
      function transfer(address to, uint value, bytes data) {8 N4 G( |2 O: |- z" a8 ~
            uint codeLength;" h- C$ I2 C0 r! J
            assembly {, I; ^0 Y- P5 N$ i6 m
                codeLength := extcodesize(_to)
    ( @5 M0 V2 C6 z/ L- Q5 u        }
    0 E) {: J; o+ ~2 K0 l        balances[msg.sender] = balances[msg.sender].sub(_value);4 E& g$ R6 i' q
            balances[_to] = balances[_to].add(_value);* }: u$ S$ R1 a( A" b' F
            if(codeLength>0) {8 f7 F0 r( |" m1 X, N" ^+ }
                // Require proper transaction handling.. m6 @. O, T1 i3 b0 ]$ N# U
                ERC223Receiver receiver = ERC223Receiver(_to);3 q" T# }8 @$ u! y, ^# r0 ^! l
                receiver.tokenFallback(msg.sender, _value, _data);
    " O2 }+ M. Z% D  j5 a        }  h$ m) H& F1 p; [+ |% k
        }& W: c! x2 i1 U6 p. B
    }# |$ M6 s/ t! E( `
    【todo】:代码解释
    2 V. A+ n/ }8 Y! Q! U$ t8 H) F  m, g# @" i& J2 P  [
    The biggest change is that ERC223 no longer allow token to be transferred to a contract that does not allow token to be withdrawn.$ Z' V+ |9 q' @* T1 i$ f1 k
    https://medium.com/cryptomover/what-are-erc20-and-erc223-tokens-307badcca5a
    7 j9 P, m6 f3 H7 w! j5 U* W6 P
  • BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
    声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    成为第一个吐槽的人

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

      0

    • 关注

      0

    • 主题

      13