Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
' M/ k3 s6 S4 p3 {0 E, t/ r" W3 ]7 f+ F. g2 h2 ~3 g; y9 M+ h- i
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
1 |4 R+ p. k" X, _9 F0 y# i6 H; F0 S- N' P# W- ^( N' w! Y. @
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。# [9 e2 G/ J9 d' H" c& ^" c* n, O
8 V; d( a& d" H6 y+ o0 a+ ^
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
! \. _& c1 x- q, W: B( s$ a( N& J0 s" r
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
# k1 D- s- S* _  u8 T; @: l5 g3 W% L- b/ o: a+ R
    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。% Q- ?" ?6 N7 c1 m
7 z' [  p; P! s6 q1 b8 p
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
/ Q5 C' ^0 i7 g9 ~  S
: x: \6 j9 w5 I% \$ [    安装
1 g! T( ?+ N  e3 Z" J
. K: K  w. I3 w8 a    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
8 f+ ^/ r9 ?& k1 x: P- M9 v3 f% n1 a% j" Y- h, P
    Truffle
* x* L7 P, R+ p. E
4 r: p# b5 K$ M" I% H$ t+ p2 c. L    打开命令行,并输入:
( a4 K: L% v+ ]1 j) U, n& U% z
    npminstall-gtruffle
; X' q+ {5 h% w8 j  ]
4 t* }7 T3 R- n7 |/ q2 I9 }    如果出现错误,建议你多阅读有关Truffle的文档。
4 x/ _- A  B& v) h
/ H# i$ \- N' K0 _6 g/ T! s9 E- E    Ganache
4 D- A$ a2 t( h- a1 c
% D$ j; `1 `+ ^    然后,安装Ganache的命令行界面:. W! T! m5 c: J5 Z0 ]/ G; D
* Z3 s+ E9 n+ r, `
    npminstall-gganache-cli
$ U: m/ u% @$ }8 |8 p! V9 r2 ]: e+ M9 d% H: a7 Y
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
0 d$ }! y6 ^* b
+ E. O: R$ Q$ l    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。7 D! U( ?1 _9 `3 k% t8 F- f
5 i) e3 {$ Y- M  v2 }
    开始吧
; J: v% s' o; \; n2 c8 W; u5 E: b' F* X$ G. q
    首先,创建一个新的文件夹,并输入。
  {9 J2 I5 z9 H9 V) ^: Q7 Z' ]4 S
    truffleinit  `4 b7 c, Q" l0 Z$ `3 m  b

5 _$ g7 |4 H# V/ s9 `0 E    它会初始化一个空的truffle项目。
( s6 W' H4 u3 A
$ @2 E; d0 O0 I1 i% p    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
9 S# G% C/ y; Z& l) `+ m+ j+ N2 y6 G0 I; Z
    将下面的代码粘贴到里面,然后保存。
+ _: n9 `  k! }3 N$ W2 r1 G. s
3 L- Q* q' k* ~# A: y    constWrestling=artifacts.require("./Wrestling.sol")
$ X+ X+ W& o, i3 a
2 H' H1 A+ U( T: _; T    module.exports=function(deployer){% N, L0 ^+ x. a
, {5 r& K9 \% M1 ^
    deployer.deploy(Wrestling);+ u& m3 M# y& D- E' ]

; l# S- t" ?, d# c' T( I2 C4 N    };
2 a) F) q4 R% p7 T3 x. r0 m% {2 |$ a; c! X
    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
4 K2 J3 n" ^! `+ t& q
: b# @7 s- p& v6 U( w! {  L    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。/ [( g3 e/ z8 [& n. v+ U
2 G% G1 r+ b) v
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:9 g! H& G  C) g; d, n

8 n0 d1 N9 H3 x0 @& U2 w    module.exports={2 |" E& d9 {4 |7 t
# ^+ T1 F5 _! H" `0 K( j0 V
    //See) P- A( w6 y3 f1 S; Q  X2 M$ E
9 f( G! C! i5 x# _% x  t
    //formoreaboutcustomizingyourTruffleconfiguration!
  X3 s2 f! p+ u2 p& D# f
5 S+ ^- E1 T# J. b. ~" t    networks:{
7 [$ e# o- ^) p5 W; l5 y7 _. G
1 s, K. q& ]  c    development:{! H, C. q9 ]0 l: _4 |% z1 c
$ e. B2 q; E3 E
    host:"127.0.0.1",
7 Y. l! ^$ h6 m$ ]6 ~4 Y/ i
3 M7 ]9 u/ S. W: r    port:7545,6 F% J( }% X7 ]+ a
$ [- E; _# M5 ^) W8 K
    network_id:"*"//Matchanynetworkid
+ R- I8 @1 P6 V- _: H" w1 l6 U1 L/ P7 s% f- k; T% q9 _
    }! M" a/ h" c- h. H

: H# Z8 J' {7 D0 [: t, R" {' ]: A    }' ]1 h2 t* U  {  m0 D8 W

8 @& s" p9 {# N; f) W- x; B    };  \& m$ ?0 z6 Z6 M  ^3 x
! j9 l. [1 g, }3 `9 o
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。. u) d+ k5 ]" J- L" V/ R% A
; v. C) Y( ]# k3 o
    现在我们准备在区块链上测试代码啦!/ {& w" x! T. M( z. @  g6 ]

+ b1 ~/ b( h- u' B+ m% P    测试我们的代码
# t- D8 S; L/ i( B/ ^0 ], i7 y
    在第一部分,我们会使用Ganache。& y9 C0 ~& D: Q  O

- n7 q) ]. P- h$ f    启动一个新的命令行,并输入以下命令:& z! V  E* z, `/ q+ q
& V( B4 t" J3 N6 ?  m8 u# A& [4 N
    ganache-cli-p75453 n$ f+ R7 l8 \; B, G' q
& q; E: k$ f  D2 h5 k/ L
    它所做的,就是告诉ganache-cli从端口7545启动。
) G" y, L; Z! _* P* `* N( |
- i% [8 n9 W8 C9 A. ~' w& _    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:9 {- y7 T9 a/ y2 _, \

5 {3 O) a: P, F5 {' L    现在,回到我们的第一个命令行界面,执行两个命令:1 l# F5 Q3 _/ P0 X- l3 H

4 l4 i3 ?4 L" E( E- ^9 T4 f    trufflecompile
1 o# a; c7 _+ F4 ~# x1 m+ T
/ s: ]! T8 E) h* z    trufflemigrate--networkdevelopment' ^, N4 ?3 R1 p% R6 k; m) {: W

9 j- K7 U8 e! c& l$ c    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
+ Q& q/ C. Y1 X0 X7 `" w1 M5 _3 B* I1 C0 }( ^# p
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
) E, `: o2 [4 F  p, v- ^2 r6 O. m- C9 r( Y
    现在,如果一切都按照预期进行,你应该会在终端上看到:+ D5 e* l- W. I$ m( @. G

* J6 ]- l- ~! `8 o" Z    注意,这里显示了实例化的Wrestling合约的地址。; E; `- F' ?1 C/ ?* X# W! @& [, g

6 ]7 _) N8 u( ]& S" S# }    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
* @0 ]( w! P8 \4 Q3 Y( O2 W+ d# O! O$ }) @$ A
    注意,它显示了实例化的Wrestling合约的地址。
* E+ F9 T8 a& e$ ]6 [# o. U: X3 U! q) Q+ C
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
, Q; V6 ?/ P& k3 h$ h/ e. `/ t* ~: i4 ]( `: Q* O
    truffleconsole--networkdevelopment' U" R' I7 B: ?; T0 O) O7 M
5 Q- N7 u  C$ c: A4 ^% ~
    首先,我们会执行这个命令:
5 }% b) T% n! `6 ^) n% M4 p; E
% T$ E& D' |+ r$ d2 l    account0=web3.eth.accounts[0]
) E8 P- J4 D, K" L
/ [0 ]! Y. p2 L$ V: o    account1=web3.eth.accounts[1]
( H& G! {; X" L
1 S  z& d# ]1 ^* C% `    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。& U! i' \# d2 N" Q4 x& F. @
: Z' P$ q# u2 g6 b5 s6 w0 I8 p; g
    然后我们输入:
  e+ c# c7 o6 R5 \& s
& U) E  t  D/ l" E! C1 e5 W+ N    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})2 \. U  C& G3 E/ ?  V8 I

1 Z0 R; I6 ?" i6 w  @    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。) P2 P: l. i. Y$ E7 J' q
0 U( |( a& @5 E
    执行下一行:
5 ^/ N# ]2 Q: Q, @  J9 ]* }0 {: p( _! c; Q" L, C
    WrestlingInstance.wrestler1.call()
! \& d- y; F% |7 f% O) a$ d
9 d4 }' W! [. [. w    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
9 ^' J7 @' |3 Y9 T( `: I# o* r5 d5 v
    然后我们把第二个账户注册为一个对手:# l0 e/ M5 |' f# l1 _9 v
7 i7 g8 k/ {" U1 r/ j8 Z0 U& Y
    WrestlingInstance.registerAsAnOpponent({from:account1})# v; p- ?2 h4 L

4 O( b- D0 @" G+ w& a3 f    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。% z* N8 Z& U9 Q* n2 D

+ g3 ]. {1 a' i- H    在执行这一行之后,它应该会返回类似的内容:
% @8 Q9 I- C% l4 v! h; W7 N! u6 p+ g! y2 y* W1 G: [
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。* B8 M7 d7 _1 g
- z% Y. R1 [7 m& P
    你可以通过执行下列代码来检索第二位参与者的地址:
6 G0 r& x: Q; p9 {/ Y' l2 F7 x- A
    WrestlingInstance.wrestler2.call()7 o) Z. V9 f% l' h

! n2 x5 j! d( t0 i    现在,玩家们可以开始角力了:
2 J: e' `2 C( a( S0 x0 _4 h4 ]- ?+ R# [4 m  C% Y
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
6 q" a/ N& x& I' I& K. V7 t
. b- j" }2 c! T  q1 A5 c: G    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
  s6 r! J* @  m4 Z
0 T, V% u* b4 ]$ C6 ]+ V) H0 ^    //Endofthefirstround$ u% |" T0 q7 R% l& Z

  c& u; g) _# Z4 `# B$ K9 \) j    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})2 U2 B0 m0 V2 V* e3 {

; o- T, A! ?8 B: Z! K! ~$ E4 c    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
1 Q6 D' k+ `8 E5 g# q4 X2 y# Z/ X6 _
    //Endofthewrestling
# {/ c$ F, P, w! {: _+ t6 T
  g3 a$ D& `) C2 {+ ]    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。7 a- F  h) w4 D& F* l- O- t
/ u% q& h8 q# x$ T
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。, X% \+ U1 ?( H% [" Z

1 N) x' T" r* U' y8 S    给你留个小练习:从合约中提取以太币。
  A7 |1 @7 h5 M- m" x! P
1 ~/ D. E5 B6 k$ o    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。) N4 p% v8 E- U

- H$ Q; s. E1 ~' s* M9 U7 d    geth如何在这个过程中发挥作用  k' r/ ^% y& p) G7 f; W/ `
+ i7 J+ j! C- ]! w7 C2 m& i7 v
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
# ^5 Z# @" t7 c8 U/ p+ ]+ n0 b/ v) ~4 r# l* \  _: F. j  [
    安装
8 b- \( S  P  I. N# I9 X% a+ U2 ^7 i! p: t8 r- M
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。
% W3 \  H2 y  u" S" T' R9 i
1 j, L$ ^+ z3 l0 m' a6 Z& v( C    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。" b& d% L. E4 y$ ?& l" S! H
0 Q) T) O+ R  T; n) h+ u1 s! Y
    创建本地私有测试网络( o: M- T5 f$ [, q2 _0 d; X/ S

9 n0 A( \) N7 E1 I+ [# C    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
" N* K2 W+ c, ?: G/ ]0 j6 H
  \8 v+ e$ T1 L. l    {
" P) Q; n- p. m( g0 p
$ n% m$ g5 M9 {, I2 S* v  {* b    "difficulty":"0x20000",& A" r: ^( E) n! q& m& I% {

* T5 d1 ^' e, [6 Y    "extraData":"",
  E3 N$ P( ]/ M$ ~5 Q% `8 G7 g6 n) j# h( x$ f9 Z) e
    "gasLimit":"0x8000000",2 t0 X7 ]& f% v

+ D% I4 e" [$ L* ^    "alloc":{},
  x& q$ K. \/ t0 U) Z
1 X( O" l7 W8 B5 S- [( L: f0 ?. Q    "config":{, ^, F9 v# k$ U0 ^. h$ Y

* V' l7 F5 l- N( `6 c  T+ C    "chainId":15,
) x" M$ _+ Q7 f: P/ I9 U2 F# S( N7 L. v# V
    "homesteadBlock":0,$ U, |5 ^$ ?4 i
+ @' y) o! S+ u* ?
    "eip155Block":0,
$ }0 A- U5 Z& \1 g( u
& u1 S9 x+ }! M+ D+ C    "eip158Block":0
( g5 s6 f) R- R& `9 m/ m5 U" L. N6 q# w/ O- h8 k
    }
' q2 R( J0 N6 ]( q3 W) z9 i* c6 E7 O2 _4 L/ H0 \7 Q
    }' C- E# G% M, R, `
" i* A0 C, }- {
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
$ B& ~+ h* j) i/ x5 u. l8 a& C, Z/ y& k/ M* R: A. H
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。. @* j- f5 W- C6 ]; ?# P. z
7 q1 l' v1 Z$ v# M  A/ I
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
, i4 {3 _( {, |1 f$ y* i& l/ A9 ?# N' h% {1 O/ ]& V) c/ E
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。9 @8 Y' a1 D4 v7 \( d" x- X, |
: N9 @, H( |1 n# p
    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):( s7 n% Z/ ^% I5 n# i2 }( j+ j  g5 u
( D. D# J# e1 l  u* L, P8 t1 |4 a
    geth--datadir=./chaindata/init./genesis.json
6 _5 S% Q2 N5 _) E5 b2 x. ~+ \& D6 E
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
4 x, Q. B( F8 x; }/ J/ J* E( X  q! f) t( A( K' ]; y2 n
    接下来,我们使用以下命令启动geth:  i$ b3 J- `( @" r9 ~3 T

9 I: I& `; e& \- \# g& i& f    geth--datadir=./chaindata/--rpc
. x6 b( W/ p3 }! K" w: ?
4 W" \/ t9 u) b0 z+ P5 i3 ]    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
) u6 H- V( a! Y' _
9 K1 Z/ \8 f  ?6 E4 E6 G0 l    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
1 P* N& g8 g" Z# B1 W8 U2 c, N9 J0 |2 e/ P& s0 J! C+ w
    mist–rpchttp://127.0.0.1:8545+ V1 _% m" R; L% }+ f( P/ e8 E8 O

5 @( ^7 d+ @5 B/ s4 Y    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
& R3 H+ K. }2 m  {: a
6 `6 s. k; _  r& r# }    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
: G( T" B; f. n9 l  z! Z: p3 O! |8 {# }5 G
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。! b0 b2 A( B- o6 I* d+ g: o

7 ]7 Y( m6 c$ q- D    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
' ?8 \# L  E) h% G( R8 T+ i
2 K4 Y$ t" x" L) k; y- e    打开一个新的命令行界面并运行以下命令:- U' }! B5 p6 q. X1 u
7 I4 n8 G* ]5 b! ~/ l
    gethattach0 G# i1 G+ E: f! J) p
) F0 |( ]0 V$ G3 O& q
    它会运行geth的控制台,现在我们可以与它进行交互。
% _6 a$ U! W5 C: t
& [9 j! E, T7 Q4 l" [! |  r    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:! Q. A* E+ L$ L7 F4 M- H6 B# H

" I: Q5 {& J0 E5 g8 ~    miner.start()
% e3 S7 g/ N! D0 O4 q
9 R# ^" W% c6 P% b( P    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。5 `' }/ c- G/ x6 F/ ^$ I
( ], h8 n, d' M# [+ X
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
4 L: }& R8 r" E* p- w7 b: n% t$ z0 B6 w' ?; c6 Q% J' W
    现在,再次打开“truffle-config.js”文件,像这样修改它:
4 B8 B1 E; P  M, L1 A" R. J3 `1 ]0 B: A+ K4 F. R( i, S. K
    module.exports={9 Q, _  x. J! q0 O
; V* q. t& N9 g% M5 L) o, B
    //See: J* p% E  p! K6 w. a! P7 b* L

- f& ^7 |" u0 a    //formoreaboutcustomizingyourTruffleconfiguration!5 b4 t2 Z/ X: A# v/ m
0 P- K# ?, {7 l" H' a
    networks:{
  R: m; p! l/ \$ _% T
' {: E4 f1 x# A+ Q. R1 a: C    development:{
8 f  y: U  R5 D, Z
( V. T/ H$ E( ]. t" a/ }+ K, N$ x    host:"127.0.0.1",) k, i. H1 @) J) Y" w3 t

, s; X" t, W. [& y    port:7545,+ W! w4 d$ G/ U* P5 l# v
& E7 t4 k( Z9 H& D9 k
    network_id:"*"
. f. y8 f4 `- ]& J) F$ r' G  }! d( M8 b5 x- \6 U
    },
9 [9 h( y; o, {% \  j" D% i2 Y( j" _/ {$ c% \+ ]2 A, [* c3 p
    ourTestNet:{
$ q' q/ M: r3 O. _9 O
3 ^+ x" L: N* v6 ~5 ]# A& ~0 h# @    host:"127.0.0.1",; ]2 p- b+ _0 U, c6 w' l: s/ S/ m

6 e8 y( k& `* _    port:8545,! |  r- i9 _2 A5 J( t  Q

! e+ z; _/ U7 `5 m- M    network_id:"*"
& R% s) i0 e  S2 J! b: s6 o4 m* I
    }
- t0 H1 ~5 d. f" x. S$ h  m% S+ V& J+ i. W- y
    }. z! A6 M# M' \% C' n3 D  ?9 n: U9 `+ J2 d
+ j% A1 U! w$ v% M1 a& `
    };4 {) g0 M2 h' z

) C7 |/ j$ Q- i% l$ V    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。. ]. J' a; V# [
* u/ H% \" w) Z
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:! e: j% K- o. w+ ^( K+ X) b. w9 Q

$ h# w/ i8 s0 x% Z    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')5 z& {& }: g, }2 i% B- {) n0 e

$ D* A; W5 I( Z, ~    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。! k  Y7 M0 A& Q. e8 @; G6 v$ f

* N2 X9 D) W. I, m' ^% ?) g    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
, q; v' j% e2 e! v3 m6 R! a5 |% j/ \: F
    trufflemigrate--networkourTestNet5 N  I8 ~. p, W1 b  h
# U4 X+ y' ^. ]* L9 E
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:. l/ T$ Y2 x" z7 C; ^: g

! `- N/ J# R. d    现在,运行以下命令启动Truffle控制台:7 O0 o  n/ ^+ x! h
( W) Q7 \7 r0 ]5 }! H7 T8 X
    truffleconsole--networkourTestNet( W1 P  E+ l  M

# T  l3 x" v  V0 B/ |    然后运行这两个命令:5 g; Z, d' p* k( b
, v9 Z( w: W! o5 V3 B
    Wrestling.address" X/ g4 f2 V6 k+ n$ z& a$ X

; q1 Q$ G! r  ^/ y/ Y/ p    JSON.stringify(Wrestling.abi)
) m3 s9 K, ~/ L6 B+ P& I( S
  |0 r" Y1 C4 t! k; u' `    你会看到这样的输出:5 ^' y, D4 D' y9 X$ ~! Y, {
2 r0 F% G4 ^8 e; p0 J1 L- m0 U
    第一行返回已部署的Wresting合约实例的地址。+ l% F$ B& q! \
, C' ^+ z5 L( v* L2 {% a
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
. p5 S; i% q. {: H2 f! Y* b# d& K* N0 ]- I" V& N
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。/ W  y2 N3 M5 N7 s. j1 ^
, G, n+ R' M4 y& g' e" `5 W
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
3 l3 E# u0 c- ~7 @6 |& V; Q% R: C+ k7 y1 h! j' ?
    然后,复制之前部署的Wrestling合约的地址和ABI:
0 q- u9 ]+ {9 h, y5 z/ i1 }4 f2 E+ R0 I6 R
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:8 f- {$ R, k. B+ k$ {/ {( o

5 j$ K0 g1 @" B6 d" Z7 O    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。" m7 e# @8 Z. g; g$ H7 w

3 h0 k5 u8 ^( c9 r    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。1 F* K& T# Q; m+ i* ]6 P( Y
  y* p* Y$ W8 D7 h
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
4 q$ I  G" c4 Z4 Q' W/ q: V5 W* n( L3 q0 O" I/ R
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。! A. S$ N/ x3 c9 Y

, \  z9 }) S) S; r  _    本教程的资源库可以在这里找到:3 t# S) j% [& M& s

3 j2 n" ]& g, s3 ]2 p    devzl/ethereum-walkthrough-2; a: U; h) ]1 U( s* C" W

( _8 s3 Y( U6 D7 o; @$ y& v$ f    总结
4 s' m+ p) v* u) d" H0 `1 q; z4 I/ N( L8 O+ y  ?' J
    我们已经学习了4种开发和部署智能合约的方法:
. N3 l; b" ~- Y( a) ]9 }( V3 w+ C: b# t3 x; ^, f6 K9 B
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。8 D) |2 [3 T, P) L8 x1 A2 ?* ?

% Q( B5 V  @0 ^5 t/ a    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
% ?, z- l2 I% v0 `8 p+ h! y8 E' @: h; U- |
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
3 O$ U+ U" A( M, _/ e* S7 l1 w  B( P5 {# H
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。
7 ]7 p7 k7 o5 x( p2 I$ O
$ y- ~7 P. z8 W2 |6 A    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13