Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:, ]" j. X4 l" l% P. B" |* Z3 ]$ G

  ^  s" v! C3 X2 B  U& o    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
& X8 F% X8 D/ U! ?' M7 [2 w. \6 g, s* U- n
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
- O" K6 H2 r& T5 \5 I* ]( Z0 Q% Q( E4 s
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
& E& a  l' N* d$ j& o/ C
7 M6 b, y+ F! j' P7 Q  I    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
1 Q7 ], q1 j& L7 M8 Q8 H
  M% Z( \- W) S; F4 j+ H    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。5 x& k& H# t8 z9 r" i- Q: i
) Y8 e7 r( C, }& m. m2 b/ L* h4 M; R
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。; j! F5 ^. D8 U( H7 v' X
" d% e6 M! q, t
    安装" N' z) Q0 h1 }9 u9 a; f' E/ @

% |4 N8 Y  }; T4 d: M) |2 P    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
2 W; X) Z/ `) }6 r/ ?- T9 ?9 z
; H; S  C# e; j4 H+ z! v    Truffle
" f6 Z  J+ J9 Y1 P( z/ ~3 o0 Q5 `
3 P5 l3 m  H+ Y& v  v8 a4 T6 `    打开命令行,并输入:
4 U: b9 v; T: Y0 z" S9 h& l
" H8 T8 z3 m3 ~    npminstall-gtruffle, O/ }- d. W* d$ D0 z

: P4 O# J+ f, W9 R    如果出现错误,建议你多阅读有关Truffle的文档。
. D/ x6 o9 ]+ ?8 [7 I) M" I
% U% M/ o, o& @    Ganache( ?1 g- C) q/ S! |  k7 _
. U+ T% U# @4 R) R3 H- D. z& Y& x
    然后,安装Ganache的命令行界面:
/ a% _3 @7 j1 f$ d* K
. g: [  r) p* J8 c  {, B: o    npminstall-gganache-cli5 v. Q/ n# }: G! k& G6 S
! d& o0 y. \  L# f9 M0 Z% g; Y
    如果你对此不是很确定,点击此处访问Ganache的Github页面。3 n7 q% y& Z- P

9 s! y+ p, ~9 b2 E* m! ~    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。0 r  h$ F8 J$ [* T

: ~4 b7 O! u1 M% y/ k    开始吧" W. b# V1 i. Z2 Q
) p6 y7 c+ S, G4 L# z' L; o) d
    首先,创建一个新的文件夹,并输入。
6 D9 j+ k5 W7 h/ d  I' w) Z# t' g/ N! D- L
    truffleinit0 Q$ {# n! O  V! U9 ]
" d8 x8 w- A& U" }% U8 G7 `" E
    它会初始化一个空的truffle项目。
: }: z9 d4 M) C8 m
; h' K, p& ?6 j  P    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。7 p5 @4 D* _& {. K7 \4 E

# |1 j5 `3 D. l  b7 x) r4 m    将下面的代码粘贴到里面,然后保存。
% H) i6 N* T  l2 U5 T$ `, p$ g
# w, {* y+ |0 Q" h# I6 p3 y    constWrestling=artifacts.require("./Wrestling.sol")
3 z# Y$ ]" f5 q7 W) s$ \0 D  Z# ~' u( o  [* X* X4 N
    module.exports=function(deployer){0 W, X9 f! g" d' Y7 j
4 Z4 F. r/ W* H8 n2 [8 J3 U6 \% a  g
    deployer.deploy(Wrestling);
5 o6 i& n: f$ C, a0 S& {, Q0 k- d' b  f# E4 y! Q9 b
    };! d9 c4 k( f9 X8 q3 b, @: X

7 v" N, }( t+ f* L: q- u; [. O    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。) q5 q# v9 j# `

2 |: ^1 y. Q% [- }. g    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。  j! K0 G4 L) F. h7 U
8 M( u7 i; r: f& Q9 w0 r
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
  [; B: T9 q$ s8 G# e: ^. ~6 e+ _  Q! R2 R
    module.exports={
. X% S5 s* a( O( r* Q' @8 n2 V5 I
7 }7 ?* n, C4 n+ p! x* a6 j    //See% p4 f' j  F  ?9 m6 t, c; J
7 }" G" r/ a1 X& H
    //formoreaboutcustomizingyourTruffleconfiguration!1 @4 F" n! y" H0 W
( O5 d+ O2 m- M+ n
    networks:{; N; Z& B+ x( e7 o2 e( F% @

. U( w1 i% M+ {# b& N5 C    development:{
1 r; X1 G5 w# {# \6 J; T; P) f9 P) W' u- [* J
    host:"127.0.0.1",( Z: d! S1 V5 c/ B

+ x* R- @; e( ^0 u    port:7545,/ z8 ], F8 J5 o" {; |, O- j

+ R& U3 ^0 X6 K) [& a    network_id:"*"//Matchanynetworkid. y, d) i. Q# A, A7 |* g! c3 w3 M8 v! Q

  r" o# C& G( j    }
* G5 [9 F! S* L7 _$ z
& x4 c) L6 C4 G& O: z    }1 o  ]% X0 `- r' K7 x9 N/ Q4 x9 o

/ k8 O1 |# r" A5 e    };
( s$ f& Y, a, k$ T( T' _) o* s
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
7 a! W3 g# F- x6 m5 j
) W  h% `0 g" i    现在我们准备在区块链上测试代码啦!+ V$ h6 U0 g  I
8 R3 i2 K9 c1 W% W7 I/ |
    测试我们的代码6 s6 A7 ^* H& J0 ?* n
2 s& Q$ T3 y3 K8 K9 d) a( V
    在第一部分,我们会使用Ganache。% C" u" a0 h- B! q/ f- t$ m

1 s( _: \6 v& Q7 m1 B) ~6 ~5 G- t    启动一个新的命令行,并输入以下命令:( l! ]5 X1 [2 b+ f
4 C' F$ N: b; j5 p( R" q
    ganache-cli-p7545
# A/ `* y4 a8 D7 y0 D: R! V; f. q" i. d: k) E) P, o4 A9 Y- w. W8 k
    它所做的,就是告诉ganache-cli从端口7545启动。9 [0 E" t: h0 H3 Z% L: Z) a
$ k/ H) e6 h0 O% ^
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:/ V' [$ w! S5 p0 H7 g

$ E! K6 P- F2 W" s# \9 }& m+ S" U1 V    现在,回到我们的第一个命令行界面,执行两个命令:  O6 r" }  I* f2 @% {. j; d% v

0 [- c$ F% ^, N4 h& R' m% n# ]7 I    trufflecompile
9 O- F! D6 M, ^/ Q% p3 l2 A" B1 s  z( g
    trufflemigrate--networkdevelopment; P" W, P9 V( Y& N) g5 v( {
' a' f$ U. m, o
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。% R  [5 f3 h, n$ P
+ E: G) v# @- f5 f9 G/ q+ a' j
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。3 ^+ R) G6 S- p4 i% I9 `

0 x- _3 l5 S3 ]9 i; h$ G, `% d    现在,如果一切都按照预期进行,你应该会在终端上看到:  _# v9 w% H, |5 Z
0 U0 t" m  x3 A, j4 \# N+ O* ?9 a' D
    注意,这里显示了实例化的Wrestling合约的地址。
! X7 v( H) f1 ~8 p0 U. q. y4 {; B% {' q% a3 u/ o
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
2 v- O4 A9 _! y# i8 X
& E  |4 _; e* b7 b. P; H, |: a    注意,它显示了实例化的Wrestling合约的地址。$ D8 t, k3 b' X

* f. j" l1 j  ?) K/ a    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。4 K1 p7 m: V5 \" G

0 c( P: _/ k/ o! ?# ?- B0 E    truffleconsole--networkdevelopment: ^- O7 k+ M7 Z2 w9 s
) R7 |) L# E; P$ \& J- n# S8 f
    首先,我们会执行这个命令:9 L5 J' {5 H: D% F1 ?/ T6 X

6 r- R& c; }. O& k2 f- B3 J! F4 W    account0=web3.eth.accounts[0]
* X1 ^) y- Q& _' C- t# F. C* u6 n- h8 N# t. e5 ^2 M
    account1=web3.eth.accounts[1]
( f7 i+ p, W& Z6 @8 P% b/ `* x9 m+ C$ n& c& N2 a7 S3 v8 y1 ?; K
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。0 [, I1 u! F& C0 y

) Z& D6 d' X7 U9 ^' m% @    然后我们输入:" M% G3 ]+ E" }  `
% c3 N" d- @+ `3 j' R! v) F
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})4 e! B3 I: X- m5 s" R* W9 D6 O

# j  |! n1 r+ J% Q! e    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。' N0 h6 {1 A3 U7 y* X6 J& m
3 Z* |* T$ s% k# t# C4 f) X& t
    执行下一行:
+ P1 Z  X6 o) P8 h- D4 |
* |9 Z' J% q$ f7 N    WrestlingInstance.wrestler1.call()7 ]5 _5 {8 _' b7 @& M) P# j( E- Y

7 V; {# g$ m6 [    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
5 q6 ]$ H8 k: [. U; d
6 r" l+ ?" \, I4 M2 |    然后我们把第二个账户注册为一个对手:
1 L, Q- `; f1 F5 O: Q1 N& s1 J5 a6 `/ H
    WrestlingInstance.registerAsAnOpponent({from:account1})0 X! d. ?; d( P& [7 [' S* P( n5 ~

$ P/ ^9 f7 _) y2 A    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。7 u9 h2 n( O* L. A' B5 m: d

& \  l$ x' ?' ~: d- m) |    在执行这一行之后,它应该会返回类似的内容:; r* I$ _4 r# b# i
5 C3 h$ p0 _3 A' A8 D
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。5 i$ G5 {- x+ K
4 _' a! W; p$ C' u3 J7 X" a% u
    你可以通过执行下列代码来检索第二位参与者的地址:  ?5 ^2 `9 f1 ]# d& _6 p

& Q0 u- v0 Z1 ^8 A, i, m: S    WrestlingInstance.wrestler2.call()
' T1 ?2 J, m; z  \  }) \$ X4 ]2 |4 }1 r. ~' S5 f' t/ L. Z
    现在,玩家们可以开始角力了:
9 w" ~) t+ Q* J. `* e1 A* {' Y4 W
$ [# N" {( F9 Y- G; v; I    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})& Y% f# @$ Q) a# z( h! ~
, m2 D! j4 D* }0 h5 ]6 D
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})3 w* ]+ R9 x; S0 d9 F, p9 G8 R

, T% Q2 c( q/ g3 \; U, I    //Endofthefirstround8 J1 e' e/ q2 w4 H

4 D, T$ w8 J* ^    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})& Z2 J9 N5 j+ `

& ]3 {) z4 \; B/ |& Z7 A1 _' S' p" |7 M    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
/ R* K7 Z# k) A! k, x9 t+ |& ^
0 d4 v! v6 n; P) C9 b9 g  Z    //Endofthewrestling5 `; N+ \! ]7 J) H

& t5 b2 n$ A8 o: ]; w9 H4 s    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。1 O" t! ~2 {" B" Z; p

. P* ]/ w1 B0 s1 X/ r4 x3 P    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。7 T0 b' G4 G  o- W

4 k9 L. v! q6 y+ K7 h9 _# @3 [# M    给你留个小练习:从合约中提取以太币。
; `- ^0 J5 e5 L6 u* z- e# G# N" D" W& w
    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
, o7 T8 ]3 l* Y$ h  Q( S* I, M0 J$ w& m5 a  X$ I
    geth如何在这个过程中发挥作用
/ i4 L) z4 M0 G4 v6 r
+ w4 S4 I! I! _; q! W    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。& Y6 N  A  d) z6 B8 d7 I+ y4 I
3 X& r' e0 v% C) O2 P
    安装
$ |, {+ n, T& T' t2 {7 |0 B
+ e0 Z4 g7 X# X, ?) k    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。
9 q8 l* G0 v6 C0 E
, \2 N! z8 s) ]! ^" Z    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
- \! ^. x) f: i% _) o
, P, P% z& z; h9 ?    创建本地私有测试网络
7 e' E" R! Y7 ?+ }0 C
2 A4 ]& [; g' l9 y  P! ^    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
2 }: z) G: M) ]7 v; |0 K* g. k% V. F% O3 x: ^
    {
6 j) U0 ?# V5 a' f# T# ~7 y+ {, b6 O8 ~- H# ~. b
    "difficulty":"0x20000",
! d0 X$ y3 S# z4 v; j, m* q% P- F3 @" k
    "extraData":"",
4 E" ?0 G+ f4 d$ t# D" M
" K# p% K9 z% S$ }7 D- y    "gasLimit":"0x8000000",
5 f* e8 x% X% R4 m4 ]. o3 }, z) {: P6 U. B) ?5 j
    "alloc":{},7 X- \4 f3 Q, Y

) V0 G- f0 P( ]& {# g$ w    "config":{
2 I% v% Y/ H% w5 T3 T
5 I9 U; x& A; v    "chainId":15,
0 v7 m3 E/ ~1 a0 s6 r# v. C" G) O
" V0 e! w  h9 m# E/ {# ]* y    "homesteadBlock":0,8 \: ]  d! V* n1 i- ], r( o) y+ B

+ o5 H( d; c* ^: b    "eip155Block":0,; N: `% ~5 O! U/ ]. p) f

* W# u" R+ |. h" y: ~( p- `3 m) Q    "eip158Block":0
" r3 x8 t; S+ a- D3 t! s
1 i9 T/ Z% Q, T' S5 Z  a6 x    }3 H, |/ [: H7 a3 @9 K9 E* P4 O- j
" R5 C. D4 D4 y. J$ Q
    }7 {6 Y+ I& j9 y$ ]

4 C* a' ?. t$ l4 M2 ?/ i& ^2 I    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。" ?. B; p3 C0 |: _& _# Z
' G/ p. K  ~3 d; A! a2 b
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。  q, y0 s; W+ D
, l% x7 m- S0 b$ @# T& s
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。8 _$ V0 U$ i0 \6 j$ g. O3 w$ u
8 m& N; S1 j! Y9 m5 J: y6 x3 t, W( j6 Z
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
" X5 B! |8 m3 \6 C+ m+ e+ u1 ?7 D7 M$ g" m0 d7 q: o6 f& w# v
    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
( [  R/ O4 L8 H& f8 G, S' U3 H" E. \3 ~+ y# W" F
    geth--datadir=./chaindata/init./genesis.json
  q2 E  D. F7 U  ~" u1 p1 V2 r8 d
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。" e+ w8 q; V- s! G# c

8 s0 Y7 O: u2 V8 Q, N    接下来,我们使用以下命令启动geth:
% J! _7 Y, H+ |9 z* c7 H' ^3 A5 Q3 W
1 N7 I2 X6 d) s7 r" Z0 b    geth--datadir=./chaindata/--rpc
$ U! S' q1 }9 n. F; ~) J- n3 e, M2 d; g7 k
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。. W# [* ]6 q  ]% R
& o+ R  r/ z" L% z/ c4 c( E
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:) f4 @# H3 M2 v9 E
6 _9 J$ Y$ Y; L* W
    mist–rpchttp://127.0.0.1:8545
6 M1 V! V# m, k( q6 ?/ @0 `1 w! _1 c1 I$ V
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
  ~( X- M& L' H" F8 J0 M8 X; G" g* s' M. o. L( b* ?
    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:; u, o) J  p- j8 N4 n+ {1 Z
' B  F, C9 c5 d+ o
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。, D( _( ?! T9 \4 s5 q# b3 R

4 a$ i: ~) i9 }. i' ]    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
# i$ U# }& g% Y( ?0 T  }% T  W- q4 M$ G5 n; L& j4 G1 N$ [* P4 ~# s7 O
    打开一个新的命令行界面并运行以下命令:: b: k4 Q0 Y& W) r7 [" ?
  x" h& N( `. B" ?
    gethattach
- @. Z8 b  M3 E" S7 U  h7 C+ k% G) B0 r7 x8 B; q
    它会运行geth的控制台,现在我们可以与它进行交互。
( \; W+ g% f$ V6 x
; z/ x4 C& @) U) ^' U# {    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
, f, P+ i# C) x- q; l: v  ]
% C8 W# p: I3 ~' ]1 `    miner.start()
  O2 y: M  Z8 ]7 O2 r* C( y2 t( \; B% p2 o, _1 n
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。2 s4 P$ f4 M: V8 I; B7 W# f

% P$ S; l6 e1 E% \    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。$ E: v) l) d# v

1 {, l9 t1 d, Z; J' S! V' t, l. r    现在,再次打开“truffle-config.js”文件,像这样修改它:8 X8 m" g1 F4 V3 l# V
! y- C! `; V" o9 v( [2 o' W- k
    module.exports={
/ @$ G+ e! d/ v) c$ L
$ S0 C: X9 c! T9 V5 [0 g    //See, k  i* Z! B0 X9 i- j7 @7 E

) A. }- [3 E; l    //formoreaboutcustomizingyourTruffleconfiguration!5 W3 Z9 \! q, V( |: C
# }5 M8 J- ]5 `8 h( s  [1 ?6 V
    networks:{% e! g" [# \# j% F0 v

4 h7 L" G  Z- ?0 N) m0 i) R    development:{
$ a& Z1 Y- ~# n5 w7 d4 F
* K& B* y' s) {  M( S$ k    host:"127.0.0.1",+ V! G) r2 a. N
# E* i4 X  ]! ^5 K1 n
    port:7545,  ~; o% G4 I" I& P! \) C

. b6 j# N7 W# G    network_id:"*"
2 K/ Q9 [5 E, M7 W# [5 j! s, u1 [6 l, ~
    },- o% V( J: R: V! ?9 ~" k
: T  M" T0 B, j7 {) F, q
    ourTestNet:{2 `% ~9 [7 p4 y4 ]5 ^+ j

( U& @$ c( z& q' }) O% _' a    host:"127.0.0.1",
1 Q# u# t. |' r+ l- @$ v+ t. K  L5 h9 s' }: j, H9 D3 j( R
    port:8545,
% z( Y, p" S" R2 {/ w; Q2 \3 u  D# v: u4 _. Q, V0 e6 q/ ]0 q
    network_id:"*"* K* j4 p# A! |  ~+ V/ M

- q5 v) {3 m& \% t( y    }
4 N+ T: f+ Q+ j( I0 |8 y9 C/ J% i, L+ e; ]$ \+ v0 y5 U
    }
4 a$ y2 {9 b! H2 z
2 g* h7 _" m5 l$ X: N& d; E* L    };$ H! O8 D* `% V. I
4 R% Q. F% f9 F) f: j4 G% v; }
    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。$ k6 {6 G) R& v6 C$ A% T1 ?6 @
3 j3 ?; b$ J. g1 \
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:' w, T  k8 [; b

4 F3 F% w, J7 w    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
7 H! T" Z1 ]$ w: l
6 [, N0 ~3 W6 c- P3 c    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
/ ?; t. D; j" m. c3 l5 ], o
/ E  a$ E1 A  E- h    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
4 Y" p$ C3 v* r' |" p* v  }2 |0 D
* |: ^' N1 g/ H8 g* \) O0 d    trufflemigrate--networkourTestNet1 @1 G2 [5 f1 |: p$ U* T

3 o; d5 R, @7 C- |. L# S- `( G4 W. S    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
& W# {$ K6 @* T/ c% z& B" Q# U& E! P" r% ~# h1 H, R
    现在,运行以下命令启动Truffle控制台:: u( h! L1 R  `3 C2 x. V

* Z" h, n- Z- l1 y# \    truffleconsole--networkourTestNet$ x1 z9 j  t& \* `& O7 o

5 z1 {# E' H% K3 a2 \7 C    然后运行这两个命令:
" A+ U0 s- S2 y. }& s! i1 F! l9 i/ m4 J' e: m# k
    Wrestling.address$ B! k. w9 P! I6 L5 q

+ t* z/ J% b& X" h2 D$ S    JSON.stringify(Wrestling.abi)4 v* e. w' Y- ]
9 Y3 Y- T( H: ?, s; L
    你会看到这样的输出:
( W. X% y+ I2 {& n3 s$ W* s
6 l# J/ V9 M, L* t1 y  ], E    第一行返回已部署的Wresting合约实例的地址。- Q# n- m$ |( u

# ]6 m; J1 B  a% W  I9 c0 m    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
1 K' y2 M( m7 ?# _# t6 e9 M
. O# G2 Q) O, [7 O; i! y. X    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。* I3 p, u5 o' E+ M

* ^' P" d0 A7 B. f: K4 L, ~) U    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
' i% j! D% a! _# R# l5 o* E
' }+ J* e: F0 V3 B9 k$ }    然后,复制之前部署的Wrestling合约的地址和ABI:
2 `" A" V2 n0 C) P+ _
0 p0 w6 T8 T  p8 P4 K7 V1 ?6 @, G    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:. H, d+ M8 H& f
3 v. r7 b* w; @8 d
    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。1 l9 ^0 n8 C" |

$ K  O# o6 k9 I    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。+ F9 V/ r1 b! b% _! v

, F+ H# `) C, i$ Q2 c! `5 l    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
) M) s; H% g# b0 w7 N' V3 d0 N
: Q* H8 K9 \3 q. s    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。3 Z9 f8 b5 s6 M/ {! `
+ c# I# L6 ?2 R" T6 G/ |  E$ O/ F* V
    本教程的资源库可以在这里找到:
' h2 B! w. M3 P' Q
- l  |; a( x& `% o/ h6 i    devzl/ethereum-walkthrough-2' T3 D: W. q! n8 P2 h) x4 m
) @, U' Z$ x# D/ Y, J. ]
    总结
/ K2 W4 H" s0 j1 y. _9 Y( }6 o2 ]1 G) k5 }0 }1 ^+ z
    我们已经学习了4种开发和部署智能合约的方法:6 W; z& S# L$ v+ N0 W9 ?

- R; ~. f% I3 N# m2 z    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。+ n2 Y' h: B. H: v! s3 q5 A

) m) i% U7 u" P2 \5 E6 O: T    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
5 ?2 v3 v+ g9 C$ z* f/ L; O3 x% A; E. W' }; j3 x! s7 X
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。3 g: F: N) z2 V3 d6 [4 P, t' K' p

+ s2 j- |* u. m    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。" r& v2 l* ^* p/ [
/ K; A# i% @, A4 U% v; G+ P8 i
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13