Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程./ ?# F, N- l# {1 Q* } @( D1 S 5 s2 \) R* d( Z! X% g1 a( H# a! d2 | 代币Token 9 R( }" q8 O5 y- O( E- w / E2 L% _: ]3 u( J* @6 v+ W* o6 B 如果不那么追求精确的定义,代币就是数字货币,比特币、以太币就是一个代币。 ( \* k5 c, _, d2 `7 S z3 k& M! A9 T' n& f 利用以太坊的智能合约可以轻松编写出属于自己的代币,代币可以代表任何可以交易的东西,如:积分、财产、证书等等。2 F( r$ F2 ^7 V: m. V 8 H+ |+ v+ |1 K 因此不管是出于商业,还是学习很多人想创建一个自己的代币,先贴一个图看看创建的代币是什么样子。, F7 B& O) `$ ^4 F( y $ a% ^ Z& Y& H0 I1 j 今天我们就来详细讲一讲怎样创建一个这样的代币。! v- [9 J) y1 H5 g6 ] 3 p |4 {6 o- f- \1 t1 n0 n ERC20Token/ |" Z. C; A7 d+ Z % g4 r6 n5 q" H n% G 也许你经常看到ERC20和代币一同出现,ERC20是以太坊定义的一个代币标准。 . D+ P0 F; B( P1 _7 W6 r6 }7 v ( v; w8 L, U7 _. E 要求我们在实现代币的时候必须要遵守的协议,如指定代币名称、总量、实现代币交易函数等,只有支持了协议才能被以太坊钱包支持。 # V8 p3 [7 x; e, k* H% q + I) V8 g% k! M" j3 m& S' ^2 j8 ? 其接口如下: ! ^2 t, F2 r8 Z8 e5 l' w5 i L 4 K" D! r- k: J
  1. contractERC20Interface{0 I @- U' t. T8 E% i' E
  2. stringpublicconstantname="TokenName"; 8 l% c2 m% G+ ]$ m6 x, E7 a7 ~
  3. stringpublicconstantsymbol="SYM";# E( g' Y! o& G5 n( p
  4. uint8publicconstantdecimals=18;//18isthemostcommonnumberofdecimalplaces7 m! G- c) [8 Q1 m1 E- W
  5. functiontotalSupply()publicconstantreturns(uint);/ {+ Y3 Q0 t9 P: L8 z* r6 e( j
  6. functionbalanceOf(addresstokenOwner)publicconstantreturns(uintbalance); & P3 B. E2 x/ {
  7. functionallowance(addresstokenOwner,addressspender)publicconstantreturns(uintremaining);# g2 `! Q" p5 A+ q
  8. functiontransfer(addressto,uinttokens)publicreturns(boolsuccess);( ]3 v' B5 g6 t5 c) p
  9. functionapprove(addressspender,uinttokens)publicreturns(boolsuccess); 9 @: z E- n7 T# n6 _- B
  10. functiontransferFrom(addressfrom,addressto,uinttokens)publicreturns(boolsuccess);3 {# t1 s0 d& o+ t# t
  11. eventTransfer(addressindexedfrom,addressindexedto,uinttokens);5 J' B, e; I+ P2 w) ?. S
  12. eventApproval(addressindexedtokenOwner,addressindexedspender,uinttokens); 2 i- ?: |6 k! P C" N
  13. }
复制代码
& z4 P2 o% X% d2 ^8 q3 ?# d; G3 R; g3 C4 w$ G 简单说明一下:# H; C) p$ e" ^3 e& h/ U, J; I5 d . m$ u5 A, [3 U s$ ? name:代币名称) F4 b- J. y. |4 `; X! `' Z; a( ~ ' h* c; e4 U4 S$ T symbol:代币符号( K% X3 p+ E1 q8 i' v5 m5 n1 `. ] & i( q8 d- `/ [* ] decimals:代币小数点位数,代币的最小单位,18表示我们可以拥有.0000000000000000001单位个代币。 , p$ q5 I8 P/ |& O% s* S% K" h8 R) R- ~ s7 S: x O: S totalSupply():发行代币总量。 & e1 V4 e3 v* M% L6 L4 } + N/ d; c9 q4 f; Q0 K# G" ` balanceOf():查看对应账号的代币余额。9 W" c4 w; k2 M! ` 9 k! Z1 N! f, R3 _, ^3 E+ O transfer():实现代币交易,用于给用户发送代币(从我们的账户里)。* ]2 t, j$ k8 O% h5 c& j e8 m% N7 q! [# `1 R transferFrom():实现代币用户之间的交易。 ' ^; L9 V5 x2 y: p. @+ Q. c 2 e! d7 b. }9 ]3 G allowance():控制代币的交易,如可交易账号及资产。 1 P9 l' @4 Z+ f4 _( j" W8 ] / S3 Y2 C1 h) z7 _2 c approve():允许用户可花费的代币数。, }( q1 p( a: v# ?/ d6 A: @ ; z2 L* s! w# S* f# W! a( ~ 编写代币合约代码 1 \/ l7 S4 _2 r" ~ * F7 x4 g J8 A% ` h2 u8 l& Y 代币合约代码: / l! H" e* N% g& i" l3 g) W5 t8 D2 b; w1 m0 y, J" X
  1. pragmasolidity^0.4.16; % p; ?3 p, \9 Y& y
  2. <div> interfacetokenRecipient{functionreceiveApproval(address_from,uint256_value,address_token,bytes_extraData)public;} 0 @& }9 o m7 |* C! K8 L6 g
  3. contractTokenERC20{ 7 c+ t& q2 P& ^7 g, @
  4. stringpublicname;5 D$ I+ C. r3 D% {. z! y
  5. stringpublicsymbol; ; X/ G4 L1 b0 D- V _8 r2 A
  6. uint8publicdecimals=18;//18是建议的默认值3 r4 t" }* k3 @( b$ k; v# P
  7. uint256publictotalSupply;8 g1 K* e) g% U6 u6 K. q! X
  8. mapping(address=>uint256)publicbalanceOf;// - [! R( i" p: } j; v6 I/ R
  9. mapping(address=>mapping(address=>uint256))publicallowance;6 |5 [4 k1 z5 F1 t
  10. eventTransfer(addressindexedfrom,addressindexedto,uint256value); / y' ^# H1 u9 ~/ U* t' M
  11. eventBurn(addressindexedfrom,uint256value); H c& r$ l7 f- j) u9 Q
  12. functionTokenERC20(uint256initialSupply,stringtokenName,stringtokenSymbol)public{, R$ i1 b: h* |# p1 J
  13. totalSupply=initialSupply*10**uint256(decimals); 1 V; k* I3 o/ i2 n+ p# Z# c3 c
  14. balanceOf[msg.sender]=totalSupply;" B" i3 V2 q) X6 B, q3 @- G
  15. name=tokenName;- M" a; X _: P3 C& |6 w
  16. symbol=tokenSymbol; 9 C! J; s+ g6 t* [
  17. }: u- O2 }; G, O
  18. function_transfer(address_from,address_to,uint_value)internal{ 8 q5 m: {6 M; G% D; C9 m9 h
  19. require(_to!=0x0); ) U3 i, \1 y' ?# v1 ?
  20. require(balanceOf[_from]>=_value); : \5 J1 ~6 D7 Q7 K; P! O
  21. require(balanceOf[_to]+_value>balanceOf[_to]);& A/ |! e6 d2 a. C+ J% h& B* u! F
  22. uintpreviousBalances=balanceOf[_from]+balanceOf[_to]; % p5 e8 x2 i) o" w. R- G& Y+ M
  23. balanceOf[_from]-=_value; , ^" ~" l- {+ b# J2 Y3 _
  24. balanceOf[_to]+=_value; 0 J8 T: r8 a9 v% W) Q1 r9 r5 T
  25. Transfer(_from,_to,_value); & @$ ^- V, Q$ p
  26. assert(balanceOf[_from]+balanceOf[_to]==previousBalances);/ n/ V; y: j+ I
  27. }* ]2 _2 @; k) t [
  28. functiontransfer(address_to,uint256_value)public{ ' {" I, L- T# H9 H, \. g
  29. _transfer(msg.sender,_to,_value); : J) O; D( j- j' _# u8 z
  30. }% [2 p3 u1 b! o9 u p. p3 ?$ L5 I
  31. functiontransferFrom(address_from,address_to,uint256_value)publicreturns(boolsuccess){ 4 \/ F+ O. R) X4 {7 C
  32. require(_value=_value); $ f$ f" J+ {+ O5 Q2 v' i5 S; a
  33. balanceOf[msg.sender]-=_value;1 W3 y/ v: S4 h/ X
  34. totalSupply-=_value;9 D0 B6 T" m2 C- _ i2 u6 c
  35. Burn(msg.sender,_value); 8 i$ f7 n* m a& L
  36. returntrue;% U9 X( v! p2 f9 }, ]- M
  37. }</div>
复制代码
& z" Z/ m8 ~4 W- h J6 R; t& [) }# S( u6 } 部署 . S! s: m$ y n; r: D* z" H$ `1 \! T6 @. G! C' Q 在开发测试智能合约时,MetaMask和RemixSolidityIDE是两个非常好用的工具,今天就用他们来完成部署。 $ W) f8 K$ G [- e ) ?" B' D Q' B( E) H. [ 本文选择了以太坊的测试网络Ropsten,如果你没有余额请点击购买buy,进入的网站可以送一些测试以太币给你,配置好之后,界面应该如下:( K' l# S+ x/ ] * y# U$ p) d; p( I1 h2 e 浏览器打开RemixSolidityIDE,复制以上源码粘贴上,在右侧选项参考如图的设置: 5 `% @9 O3 I( [ 5 K' v4 z" o, {* _ 注意Environment和Account和MetaMask保持一致,然后选择合约TokenERC20,填入你想要的发行量,名称及代号,就可以创建合约了。9 |. ? Z0 O7 F( }0 l0 E8 h & w. C$ F0 H9 {, U" W 这时MetaMask会弹出一个交易确认框,点SUBMIT。待合约部署交易确认之后,复制合约地址。, S7 o0 q2 s3 S0 g5 f d* n$ H4 e7 q* X( Z 3.打开Metamask界面,切换到TOKENS,点添加合约,出现如下对话框:4 v: x0 t- S* d% O/ R 9 l/ E- ?9 T$ r& w* u; X 填入刚刚复制的地址,点ADD,这时你就可以看到你创建的代币了,如图:$ j0 @* l" k9 s4 X % d, c# ?& ]/ [( e" M8 L$ X 哈哈,你已经完成了代币的创建和部署(正式网络和测试网络部署方法一样),可以在Etherscan查询到我们刚刚部署的代币。可以用它进行ICO了,从此走上人生巅峰(玩笑话,不鼓励大家发行无意义的代币)。 " R$ x4 @* J( N" q6 Q5 f2 _% w' `; k3 v6 |7 n' p' H. I 代币交易3 [) J# k9 V4 {3 T2 ?: u ' Z7 E4 i J3 `3 Y* U; r! X 由于MetaMask插件没有提供代币交易功能,同时考虑到很多人并没有以太坊钱包或是被以太坊钱包网络同步问题折磨,今天我用网页钱包来讲解代币交易。 1 B( A4 v$ R/ Q8 j% m s+ w e # I% k# E* ^" a 进入网页钱包地址,第一次进入有一些安全提示需要用户确认。9 o5 o7 l& t7 m% f5 h. R5 D( o8 N 0 Q7 |" d( g2 O+ z: k# y2 Q0 p 进入之后,按照下图进行设置:9 i. U! U* A6 l6 t4 M5 g0 K) _ + q6 T, N; Y" L& n. N4 j 连接上之后,如图6 \! X& _% y" c, U2 X 9 D2 I7 z3 K7 T: A0 ~; h 需要添加代币,填入代币合约地址。' f4 H6 g, \' |9 `3 T / M5 \- t0 R5 w1 ^, \ I 4.进行代币转账交易 - ?( i# Z' j, `0 e9 A- E * t: ~/ d! l t) q; W# r0 O 在接下来的交易确认也,点击确认即可。# V+ G2 v( K: j6 F8 Z" M& R % ~0 R" y8 B8 l% g n 5.交易完成后,可以看到MetaMask中代币余额减少了,如图: * \6 \ I$ ?* F7 h/ x' P+ T4 T7 Z4 I/ s, Q l 代币交易是不是很简单,只要明白了交易流程,使用其他的钱包也是一样的道理。 + r4 D7 B( `' ~& e | 6 ]4 ?0 I0 f$ X( O. X5 }# M 参考文档 ' l0 ~6 U" G! Y1 y8 n$ c/ j" b0 f6 ~ & ]- y: x) m J" ? 代币标准% x4 y' ?) Z1 d7 P & Y* k& z: F7 z1 z0 V/ m. j- ]( W: K Createyourowncrypto-currencywithethereum
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

ezbdm7678 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5