- functiontransfer(address_to,uint256_value)publicreturns(bool){+ I. W3 F2 r1 M- u/ B ?* ]& Y* r- m
- & z* }4 M, H; h/ }; {
- //avoidsendingtokenstothe0x0address0 c+ D# g$ w, R. O5 c- ?
- % M- I9 f$ {$ m7 n3 s' j# Q* {
- require(_to!=address(0));- i& B. u" {- w
- & Z' `/ e+ N2 a$ \ V. m" ^
- //makesurethesenderhasenoughtokens) M3 \: e' I6 u4 R( ?/ C# T. S
- + w& \" z h4 D* G0 u# F
- require(_value
* c3 B& b& M6 C- o: i% }5 R8 n6 I
在转账的时候只需要指定对方的地址,以及转账金额,而不需要指定转出的地址,因为可以使用smg.sender作为转出地址。: k; J/ S' z6 _2 B& L m
6 `1 w! [- c" B
转账的方法很简单,连数据库都不需要调用,直接更改balance[]键值对的值就好了,给msg.sender的balance扣掉转账金额,给_to的balance增加转账金额。balance[]键值对永久的保存在智能合约自己的存储空间里。/ o. }" y+ h) m! E0 M
Thecontract’slong-termstorage,akey/valuestore.Unlikestackandmemory,whichresetaftercomputationends,storagepersistsforthelongterm.
https://github.com/ethereum/wiki ... r#ethereum-accounts0 b& c) }" n& `
5 `$ y* I/ N4 W3 w3 x4 \' L a) c% K1 H
另外还有其他一些函数:6 n# B' q5 y* I4 G6 s
approve():让A地址可以调用B地址一定额度
- g8 f; [# R# V. b: H1 i. J$ g1 D3 h
allownance():查看A地址可以从B地址调用的额度! ?) E% w" V* o8 n2 A
6 j- f7 k$ w# ~8 z7 V7 X
transferFrom():使用B地址转账,和transfer()不同的是,transferFrom()需要制定转出地址& ]+ _7 d, h0 @
" Z+ d8 P$ V. Y; v1 @. {
使用approve()函数有一个需要注意的问题,当需要更改额度,重新调用函数的时候,会有安全问题。因为区块链的操作不是实时的,而是作为等待被打包的交易,会有延迟,在更改额度的交易还没被打包之前。A地址可以将它权限范围的所有额度都用完,当更改额度的交易被打包后,A地址又可以将新的额度全部用完。
9 @! Z* N* \) _, p2 b) E
改进方案- w( ~9 b. o) W, Q# b
6 c4 [. B) X3 T. d. b# l( _) `8 O
ERC20作为2015年提出的方案,实际使用中发现有些问题,然后也有人提出解决办法,比如ERC223和ERC777。. d# L v7 u, E
& y: j: u2 T: t) G+ @
但是升级ERC20标准非常困难,因为已有的ERC20标准已被广泛采纳,所有周边的生态都是使用这个标准——钱包、交易所。升级需要新建一个符合新的规范的智能合约,所有的交易所都需要更新智能合约地址。
ERC20有什么用?
它是个统一标准,便于第三方工具的开发,如果没有标准,mist,metamask这类钱包工具就很为难,它们需要为每一种币适配。但是如果都遵循同样的标准,执行同样的操作,那么钱包工具就可以明确的知道对每个用户的操作需要调用哪个智能合约函数。当大多数token都遵循ERC20标准,你不遵守,那么你的token就会无法被钱包识别。% Z) T* C) j1 B1 ]1 W [$ D