Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:" s8 _, @4 X) e7 a/ W
( B( c" @6 j% L4 ?
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。. z* U! J, _7 w  v$ Q

9 i/ K* R6 M: a    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。/ q! P$ R4 m. W% Z1 m

2 \, D' k* u6 s    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
4 \4 V4 j( |: e  u# e' E7 x5 h, K3 }5 S$ L6 H
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
$ n6 S9 r; H- H$ m. Q( Q4 ^. M% x3 c+ }* n; \
    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
( @! I/ i' _3 D+ F+ C; D/ Y% Z$ p1 K5 Y& }
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
6 P' ~- T& A9 N. i( G$ l  }, x0 s, V& b4 R
    安装8 ?4 Y8 S& @; C) g2 `
3 B; |# T$ d, E# i8 n$ ~
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。; k) D$ [/ N/ w& e$ d# Q& g% k
0 |) R! }% Y" [' N: h' c
    Truffle
( ~4 g: a2 T. L/ Q9 i! Y! i# U' f# W0 p  ~# y
    打开命令行,并输入:
7 U3 b% Y0 T) p' m$ `0 U
6 i) j2 i9 b  W  q/ X    npminstall-gtruffle, Z9 D; }1 Y. ~7 a$ v, W

% j  p* c3 j! @; j    如果出现错误,建议你多阅读有关Truffle的文档。' C! z- g3 z% @

; g+ K- L3 z6 n    Ganache. e/ h$ Q2 N6 z; j1 c

6 ]) w$ p! ~* O0 {; m    然后,安装Ganache的命令行界面:
# i' [8 t6 H3 M3 r; q/ L( G
) p* V' H, O% W5 a) Z* L    npminstall-gganache-cli
8 @$ v( [% C+ t) \
/ U/ u0 n$ e7 [0 ^& e( J    如果你对此不是很确定,点击此处访问Ganache的Github页面。
1 N" q7 Z' j2 m$ A; p0 u
) p. ?1 e. L$ k1 l% j& o    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
9 _9 n/ @+ B, [$ W6 T9 Z0 u9 M% P# [9 D& [
    开始吧5 t/ i6 B: y; D5 y

4 e. ^. o8 r( Z' T1 f  i1 Q    首先,创建一个新的文件夹,并输入。) o+ I7 g' d3 g& _; V
0 b' e( ~9 d" C" V2 i) C
    truffleinit
; y7 Y" Z5 }8 D1 p3 l* \% e
' N# x5 ~% p, `! [    它会初始化一个空的truffle项目。
+ m( l. Q- h: b- p, F$ R6 ?! J/ z
) I+ p0 i$ L) i; u$ C6 w    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。. a, E/ S( A3 S2 s* w4 `* p

' R4 e% a/ a; z, d% M    将下面的代码粘贴到里面,然后保存。# k. x( _6 E+ n. r: F* e
- L0 t2 o: O# l) r) c
    constWrestling=artifacts.require("./Wrestling.sol")
  R; X# |4 g0 l2 k  A& b9 ?) p5 _8 Y# E3 C
    module.exports=function(deployer){
- \* ^, h6 g) Q. C- @4 y
( E7 e8 p- ?* Z, y+ z- ^+ \# E    deployer.deploy(Wrestling);
& i0 |/ q9 V6 C8 e5 |! a# M
% L8 l! |3 h3 [% j: \    };
; j: G& l- V1 \: z6 Q6 i- C
+ z( {( ^* G' a( r; w    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
" e( ~4 `6 i$ A% U; Q
: P& ]8 b+ {7 I" O) b/ h    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。4 n! Y" R7 [* d0 B. u
8 a$ o, p+ J% g2 H( ?* t  o
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
, F, I- V6 E& y/ e' @/ A1 V9 i6 u2 E3 ~# V3 Z
    module.exports={
7 |1 s! h& @- h& e4 w+ d) T$ |
9 K% P0 K0 ~' j# L- p  h# K    //See9 ^4 }; A7 v* g9 {9 R

/ N( e- L7 a. Z4 K" Q# N' C    //formoreaboutcustomizingyourTruffleconfiguration!
& N5 G) B* V: h4 }' d2 R
5 E+ W& p+ T0 ^  A/ c    networks:{
' @0 c: K4 P4 z2 q/ I( R7 l. T0 c' [) R2 T2 N: X/ O
    development:{
# G) y7 t! T9 C2 c4 t* _# `2 P$ a/ D9 R  e& y* n/ e
    host:"127.0.0.1",
( Y& I# u( \: m  [+ Y- V& y- Z& i% r3 m, |* y; x3 V% }
    port:7545,' ]* r7 w% t5 f% f0 n3 w, o

  r$ c1 ~1 ]$ Y3 z    network_id:"*"//Matchanynetworkid5 f  c/ F7 C, y! {  Z( x+ e
+ y6 v- k3 @! ]! W" c5 j* [6 ^9 w
    }
7 a3 M0 S) \* ?4 u* Q4 w+ Y, {. |( ]
7 X1 U1 `9 X, s" U    }
8 F5 W+ G7 C, C' O  g4 G; e& ?0 d" v  {) l7 Y  ]. F! @. l& I3 m! w
    };
. o* e/ f: U( G5 M+ R8 h
' c. l* n0 c# S& C$ W    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
9 q- q* q% N4 J: I- ?9 U/ c% F* n, }
    现在我们准备在区块链上测试代码啦!1 a/ Q$ Q5 C( L& `+ a. O$ i" f

+ F* g5 l# f! b& T' S    测试我们的代码& L8 L& U& o0 ^0 I  j# M6 n# s
) Z4 q4 U& S/ p# _/ s
    在第一部分,我们会使用Ganache。
" J3 ?" S" z0 @: O; i. V
6 ~, n* J% g5 B, E5 l3 V# L    启动一个新的命令行,并输入以下命令:
6 n" I' R% ~* {: L; f% N8 ^) _
$ j! B" q: Z7 k+ |( e9 e    ganache-cli-p7545: H4 V( s; k# G7 L2 O

. C! z* K  E& B+ L8 \# e- |    它所做的,就是告诉ganache-cli从端口7545启动。5 ?% ]) Y1 P9 d$ w" u2 z3 J  Q

  B) m) z9 Q) |    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
& w8 f2 Z) Z8 N9 }& l
# r& m  M3 d3 S, J/ ^    现在,回到我们的第一个命令行界面,执行两个命令:
( ^/ [/ m/ }8 C& G
+ f8 i: x' K8 }/ R0 [    trufflecompile+ k- ]5 S: W7 i7 k5 u8 v( c( N5 K

4 s6 F; ^& _$ p    trufflemigrate--networkdevelopment: `1 f$ h+ }$ Z' m2 k1 u
6 s0 B) H. Z5 _# r5 F, y
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
0 N7 s6 L3 x. M8 t' b5 U) {& X9 R: ]- M4 e
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。- X2 j+ j! R7 b% C; @, B! [

0 Y0 ?+ M5 p0 Q    现在,如果一切都按照预期进行,你应该会在终端上看到:; I  m0 _; t8 W. u$ ~, Q! r  D* R  W

7 S# Z8 [. N( m* g    注意,这里显示了实例化的Wrestling合约的地址。
8 A/ M+ T: h% P' K' v$ S# [$ o
0 ?% z& M6 Q* h6 V/ h7 i0 {$ p" S    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
- Y: P. W  s6 s$ D/ @
7 v, n3 J5 F! C6 M    注意,它显示了实例化的Wrestling合约的地址。7 b$ K( n$ q8 l- S
4 [" N' M! a  m, S
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。  Y% z# g1 K1 Y. R7 [3 T1 \

. X% h. T2 }' h5 h8 ^9 Q. Y2 e    truffleconsole--networkdevelopment+ {1 l4 Y1 B: h7 O  z

& }) k$ \( _4 B2 A    首先,我们会执行这个命令:
, G3 U% O* }+ i
+ S& j6 _( c' X% w) `    account0=web3.eth.accounts[0]% X& m3 b: ^, N5 E2 W) A+ n# z

1 S8 o* k* U' J, v& x8 j' k+ e: D    account1=web3.eth.accounts[1]/ t* f" P! d: J3 E$ `8 B

- P# y- O# P, h% W7 \+ \    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
2 Z5 }7 g7 g# Y3 C' K- r* K4 _* @  a7 F6 b
    然后我们输入:
. q! u+ y( `. s2 x4 |( K9 C6 Y
3 V5 e9 |/ h. S- c2 x    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})
: l; z7 ?. W8 q. Z7 H1 N( D- }: N7 F9 e8 }2 O4 w  M$ \0 c
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
  ^. S6 K" f  X5 e" Y6 o
+ L) m1 p3 y$ E+ S, h- g    执行下一行:4 _% t# |& S7 @" T
( O6 L1 M$ v( D0 P
    WrestlingInstance.wrestler1.call()
. q5 ~8 P6 u5 K! y- `5 K3 p: N' N+ M5 A/ I
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。+ d9 c* ]% @- C5 M/ g! j# ]

* ^# d+ y$ k0 z" m7 Y    然后我们把第二个账户注册为一个对手:
' q% z+ B- }! C3 M  S5 q6 \
0 d- x3 l( ?! G6 e( l* U2 x3 X    WrestlingInstance.registerAsAnOpponent({from:account1})
8 A1 G. @& y2 \6 j5 E2 F# D' Q1 G& R! v* I: J: }
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。
0 v6 y# i& j7 ]
" A( h% g! v6 n# j& R    在执行这一行之后,它应该会返回类似的内容:
! h8 U5 w- P( i) s8 P! ~& B
: J. M% f6 C+ y( s1 P2 r. V    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。& J7 p# z/ g' L6 }% M
0 t9 Z8 |3 T- ~3 W
    你可以通过执行下列代码来检索第二位参与者的地址:5 |1 ~* V/ H: H' r

2 Z" [$ s7 y2 c5 e' z/ Y: |    WrestlingInstance.wrestler2.call()
9 x+ _: V/ m7 K& M. B( h& p9 n4 L4 T. X2 ^% \- Y
    现在,玩家们可以开始角力了:# v) G8 C3 U  _. F7 U, o7 d2 ?
1 O4 z+ w; \3 S+ n! S
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
# t. B/ J9 ]9 B
8 M1 O+ m* F* j" _1 t% R    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
3 O. o$ ^) q0 M6 k! f: {
/ _: E; U$ h! U3 I  M9 v. s* s9 V6 ~    //Endofthefirstround% R+ b8 E' |4 {8 a; A0 _9 r

% d: h/ O1 d7 w( c1 b+ `8 C    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")}), n& d3 Y0 H" o" H7 c* x9 k9 Y" x3 {8 Z

0 [7 T" K* x4 v0 h+ ?    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})* }+ ^+ m# R9 C& ^4 q
+ n& N' A2 S! o, ^$ `) q  i
    //Endofthewrestling
8 }# ?6 S& J' O1 c$ x5 R, p# ]0 k+ L4 n) D$ m
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
7 X3 ?! L! n, i( a3 b4 b
) ]  L, _0 N9 ]5 ?    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。( V. w0 q1 T4 d' A9 Q

0 F1 L& Z7 f0 o* x8 g    给你留个小练习:从合约中提取以太币。
) o$ z' K5 d7 ~9 B* \  y8 y  x, t6 B/ g0 T; J2 n( }7 {
    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
9 z( m# [8 z. x# r2 s2 {' _' _. e1 P) j
    geth如何在这个过程中发挥作用
7 X8 T2 w" ^+ {$ Q+ N( X! P& o; \% ^: y6 Z7 X1 d0 T
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
- K3 W2 B; F6 B
* Y0 k! l% r* |4 d    安装
) g4 A) r. P; L4 j& @& P5 I9 x
! P& {5 {1 c  q2 k+ c4 X, R    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。4 I; y: u6 p  ?7 M

% X1 b' h$ K- L& V' Z    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。( L+ ?7 j' m) c
4 C1 J* m( Z1 a7 R; k
    创建本地私有测试网络  f# d+ d7 P# {$ n; N
$ |6 ^+ ]" Y9 k% ^
    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
8 `% C# r- s6 P1 q  @2 `! M( |2 Y/ e
& p$ x" L2 x4 x$ M8 ?    {
+ i% P/ L5 N2 r8 ?2 C! c4 v% t& d* b; j
    "difficulty":"0x20000",: P" m* Q# V. [3 R

0 }" M1 }7 n5 @  ?2 x) n" y    "extraData":"",
. A( f, a4 w( {% @2 S
2 I0 d2 e. w0 L8 f5 ^1 R    "gasLimit":"0x8000000",3 K* [/ N( R9 E( R
8 Y: T; P1 L, Q) |( N
    "alloc":{},; D' `. q  |" r( a* c* n
' M& f/ u# k! Y3 p$ B
    "config":{
/ C, Y: I1 K  w/ X# Q4 F" Y  `! G, n# \5 D0 c
    "chainId":15,
' j) a- s, B# ^: P, t1 _+ e9 T4 _
6 d' A$ g1 A3 }; f7 ?- T    "homesteadBlock":0,
: i; U$ H9 e. g$ x+ i( c7 B! e; ]' z& @
    "eip155Block":0,9 M+ L+ I* c1 W

5 P+ L4 Q. {2 p* t7 s0 K    "eip158Block":0' o7 y* n/ V% J) L

# f8 P* }9 `/ m% @  V9 a0 \    }% p/ ]4 X+ l( {+ o3 p8 ?" H

* L  n0 O# [9 D" C# }( Y1 W1 {    }3 D0 B$ W3 o% s! |2 F5 Q
3 {; q2 N4 p& H+ S( P+ H+ {$ H
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
" T- U# j  M2 F3 S, O" @+ K2 W% k8 y4 ?4 w; V8 _# W* x
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。" P- P3 P" D; u( q
, R4 r$ S) D/ ?7 d# c  C' p
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
% v. c- y; M% G5 L$ T+ R
0 N9 M% S, r  v% e    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。+ J1 D- Z6 x& {* K- J. M

4 B0 R3 D! V8 t! N9 H' R# o/ R    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):& a- s  K" ?& ^# j
7 Z4 T" D: d6 r) d# ~& Q
    geth--datadir=./chaindata/init./genesis.json/ s- ?  J, J8 a7 O
: ^  ~) Y2 X( e" ?" ]/ _
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
" O0 Z1 {1 B5 _; h- ~# f7 g" P4 X# T
    接下来,我们使用以下命令启动geth:
6 }8 A6 D8 F# _; P, W- q/ Q
" P7 V6 K. [# C( X8 L# b    geth--datadir=./chaindata/--rpc8 i0 P  R, u% D0 K  |# ?
  x" n; ?9 u. s5 k; \' H  u9 g9 O. p
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。0 L2 w2 K( y& I% G) h) I5 Q

! i9 h) d$ a: g( T0 z3 q" [) J    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:2 H! t6 D! {5 j, H3 |$ ^( p

4 m  K5 e9 D1 [( s    mist–rpchttp://127.0.0.1:8545
' B0 k4 J! x. [8 s0 X; X# ^3 V. z. K6 T7 x* ^0 @$ A
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。- o9 p, X$ C) r4 }; F

7 y. b  |; ]: ]7 v2 ?    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
1 S  @# @4 T4 n1 R# ^3 n& a. B7 _5 M4 W& v- T( l! w% O
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。4 n2 g+ v4 L5 @+ u- F0 v2 Q4 F
0 O8 j* _2 X2 F* {4 S2 ^: H
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
$ b  V+ g: }3 d* m$ z* e' k% h1 f' i3 f
    打开一个新的命令行界面并运行以下命令:
% L7 x+ V; \" r* ~4 b% A9 }2 d5 s
    gethattach
8 p) P4 L! ?, t7 w& i- W! `/ R
( n7 V; _- `, a0 c9 U" u! k8 q    它会运行geth的控制台,现在我们可以与它进行交互。& a9 N/ @/ v! P6 N# }# v$ c6 }
: d- x9 ~& x' r$ e( n5 o; Z" u- \
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
) ~- q$ \9 t: Z) D7 q
/ g1 Q2 O( y- j) B5 B    miner.start()
: w- x/ b5 {9 n2 {3 J0 Z0 t: w5 I* ]+ [
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。; h3 w* d3 c" _: ?4 X5 {5 G# R$ l5 z

7 M! Z5 ]. k1 c8 |! l( _    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。8 ^3 D5 M! k2 }( ?! H! t
5 a6 P1 d8 G) L$ j( v% G, T+ V
    现在,再次打开“truffle-config.js”文件,像这样修改它:8 r0 o" P& O! o$ H
- d. ~% ?" \4 w% o
    module.exports={( r* |) h+ k& v, ~! {( H5 Y
: C" h1 c! A* z
    //See- w- S( s2 f4 J2 {; n/ f1 _4 i

' Q3 {* g: R% X+ {: ^    //formoreaboutcustomizingyourTruffleconfiguration!
! A8 S# }" v4 q3 Y& ^; S( N/ p
1 }# x2 e( B! e0 C) _+ Y    networks:{
! e/ _& Z4 N2 h5 a& d+ _. n1 s' N( \* N. S; }5 g
    development:{
  J+ a+ E5 k2 x* n( o( f3 n9 a/ F6 d. ]8 E
    host:"127.0.0.1",: K0 o, J2 f; a9 I& l
2 A, i2 u8 k% S/ s2 c* }: j
    port:7545,
4 z- X7 ^, N: N( B' q
5 y5 b: Z& N! {2 ^% e+ t    network_id:"*"  ?% A: E  `1 T) u! q, j6 f
$ ?0 x9 m( I# c8 F8 R
    },7 C- g& Y- _/ |' ~$ ^2 F

0 e- Y& n' m5 C" h. R4 J    ourTestNet:{  |7 L8 }. B9 W5 \

. m5 _2 {( D. H6 i    host:"127.0.0.1",
" [8 L0 a. I" f- g: d/ o8 H) w8 {/ R0 P, c
    port:8545,
/ m8 @) I1 l% A7 x, T
" G3 l# x/ }' s0 E& V( K" B    network_id:"*"& I, y% i3 b- S$ K3 m" q
+ y4 b; Z/ y: \6 ]& S3 L' K
    }. D& l4 M4 v# [3 a- B+ C' s! u8 N
7 s; N' A6 X' G$ }% s4 m. M
    }/ ?0 [2 Y/ Y4 U) u

% j$ i: v5 O# H4 O3 E; {7 X" C    };0 Z! w' _. c/ z* j; u
& Y0 S& J" n+ u/ x1 [/ {
    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。
# N3 f, a' q8 K5 z
. ]" a9 R4 x3 C6 Z- b    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
* I) d: l7 o1 }0 |- l6 c' X, \$ @1 M0 _1 r
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')& J+ f8 ~+ j2 e7 q7 _$ B
4 y6 ]* l' w0 s9 Y1 J
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
4 m, d' F& x% y! [$ Y8 _
% F1 x4 F" n; x  {3 f/ l2 T    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:  V# f: J8 ~) S
" S! N  _2 ]$ n* O' [) c- ^
    trufflemigrate--networkourTestNet! \' u9 _2 a" Y$ m
: u3 H* M: l1 y: R& I- }  G9 ^
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:3 r6 B3 [: n: o6 E; h  Z
( [/ o: Z( p5 p, K/ n4 B
    现在,运行以下命令启动Truffle控制台:- O3 M0 {6 E6 G

, S7 M) H* ^; u5 F8 R    truffleconsole--networkourTestNet. b" q. n8 n6 |" \+ h, J* y

4 C0 a6 Y9 S6 x1 ~2 n  B    然后运行这两个命令:2 k, ~# Y; P5 E$ X) h, ^# k

! k$ Y. b/ }$ t( a( Z5 @    Wrestling.address
9 t8 [' S. c4 T5 [* c5 `1 @# {8 U  q. n6 i
    JSON.stringify(Wrestling.abi)
6 Y1 N8 O7 S7 W: u2 c
& W7 Y' R& O/ E2 N& b5 A/ x    你会看到这样的输出:
) s" b* O& E+ w5 G; |: h) m
0 W+ j) U" }, w9 @- x1 j) u3 c    第一行返回已部署的Wresting合约实例的地址。
: W$ {/ u" v  y
7 x! F4 V0 O* b* k5 o6 y    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。1 g2 g/ x: j6 d
* j6 F" A: _, l6 i9 k$ s
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
$ s3 H/ i: @; B& U$ ]0 w0 {0 m: }2 e# S6 \6 y
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
1 r. z" c8 g$ @, q
% E/ [$ J+ k5 F) {3 R" c4 ~+ t    然后,复制之前部署的Wrestling合约的地址和ABI:  H" B  @  ~" p* b
; O9 D+ T3 T( `; I9 \
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:; F' r! p9 c, p7 I6 F9 I/ T6 y

, ]! z% x# C5 P6 S    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
' v3 N0 }: M' s; M  R6 f4 N$ p2 M6 \# M4 Y5 Q
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。8 ?, F1 b# S3 S" b4 n
& U  [  a4 Y8 \2 g
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
# x/ X, Y3 ~. W, }
, a$ X3 G# f- t1 x8 [+ z) V' q    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
0 B( `- C9 }" q1 X  q. }: V0 o
0 O+ F# a" v  @7 I: W( t4 S; K    本教程的资源库可以在这里找到:# F: m1 A. O' }" \: j
/ ~) s3 f; L1 l4 x/ n6 t, f
    devzl/ethereum-walkthrough-2
: S2 D7 C/ k6 ~* H
) ~3 F+ g+ h5 D0 Q    总结
2 `6 K' B. C9 L1 s
6 r- @4 }5 \, g1 i    我们已经学习了4种开发和部署智能合约的方法:  w0 R. r3 q; ^" J: Y) K9 a
# ^3 _- D- {1 A
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
' J+ ^) H1 f9 f! l( ]/ T6 R: f
# @. G" Y/ J' E7 a5 k! T. A; J    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
* ]" @4 {$ b" a. r( w& C2 _5 F" N0 `; p- K; ^3 _7 k8 G
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。# Y) S' S  f. N% S

3 q# k$ N; a8 e! k3 n    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。, f! R; J' s8 h& g( x! j
4 J4 S3 c3 Y: J* J
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13