Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
9 m5 o: Y# M- Z! \& t& }0 q: A) n# Y0 \$ E/ J
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。" t. ~: M4 m, D3 ]- g8 Q
$ g4 ?2 e0 B# l8 S* @9 ?0 G8 w1 h
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。4 `& g; A) b. j  W5 K( a0 k  g
0 {8 h/ Z2 t  ?7 `# [* s
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
; J( N9 [2 {4 {2 O7 s" a: r$ y
5 Y) W% J* d' e% x    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
8 X$ q& x) t7 s- K8 `# O( a
5 \1 w/ [, n& s    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。# i3 b# \$ j, b7 _' c/ F% \

" X0 Q( c; T3 Y+ _  o8 D+ {    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
$ B: X1 p/ U8 b' {8 K0 K; m4 W
" U# s( {# S  @9 f7 w, d- E    安装( o/ s0 p% O+ S  K3 o+ w

* n' k/ O$ ?' Q3 `7 ?& k2 R    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
) o9 }( ?5 u* i4 ]; ]) Y8 P' z. A/ s% ?6 `# J# m) G% j0 h: s5 c
    Truffle; ~) D# E$ r, Z
$ r& ]( p; y  u. L, }0 y
    打开命令行,并输入:
0 f7 |7 L+ O0 O& A% T  A9 r5 f) G# n. R2 z: j; v
    npminstall-gtruffle
' H: X4 Y# v) y. o6 {! i- g2 f' v4 p! g6 j+ @7 q# L
    如果出现错误,建议你多阅读有关Truffle的文档。! t2 Y4 }8 x4 M. S: }( [: @
" z  T0 q3 |3 L% u
    Ganache/ H& _  g* ?( ]8 \+ ^$ t
) _- Q  e1 H/ ]5 n6 f5 p. |
    然后,安装Ganache的命令行界面:9 o# z8 a& m# A6 n  Z
+ N) d9 g2 H, l
    npminstall-gganache-cli7 Z* H; H& W% I) Q
: r2 {, u" H0 d2 S
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
: E8 \4 N: S1 X7 u) P) t( a2 m8 p
! y9 E0 U& M9 R7 ?; e; }    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。. A9 I" ?2 M; u) G- q
2 [, V( K! M+ M0 z" k: V5 z! ?
    开始吧
4 i" y% B% e4 b- \, \0 B  k
2 W3 E- M2 O* [    首先,创建一个新的文件夹,并输入。
4 H# b. L& N4 e' o1 L- s2 Z+ |
1 B3 d# p" b$ g( S, L0 X/ X    truffleinit
' p' D" r( b( ?6 x$ F4 M
, ~. l/ K# s- r( {+ i2 ^: j    它会初始化一个空的truffle项目。
+ P* Y0 \3 O5 Y3 y) w9 B0 R
* {; Y$ R$ ^  Q6 ~& R2 c) ]8 z    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
# F9 u* O9 O5 @! o
5 o* A8 p  o8 B" q    将下面的代码粘贴到里面,然后保存。" w0 R- V; `$ V3 R

" h/ A0 c9 W& j    constWrestling=artifacts.require("./Wrestling.sol")( Y; h* R, ?3 W) Z" I
1 @; [6 G- e1 Q6 E0 F4 k
    module.exports=function(deployer){" B( M7 s( C& W3 ?& q
/ b, S+ A; G7 ?* I
    deployer.deploy(Wrestling);1 e  a+ J) ]- c9 ?% p6 p

9 P! l9 N$ B% G0 f1 J0 V    };0 {9 c" ^% K9 J, W" n, m

1 b% Y1 K- @! w2 f% d* V    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
/ [7 o- H( T: q1 |6 W/ ?3 t6 e2 t
/ D- U) j2 c1 S0 v3 z% v: w    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。2 P6 G3 E/ y: U2 \+ d

, J0 i( L4 X; N/ N/ I: V/ D6 Y    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:3 d0 A9 X5 P2 b- S1 r5 B* T3 @: ^

0 V; Y- ]$ m4 u! Y    module.exports={
3 ~) `: e: s, u
% E% Q3 p8 a) a: E6 j    //See) W( j7 J" R$ t

* Z5 p. h6 ~3 F; m* _( p# N" J    //formoreaboutcustomizingyourTruffleconfiguration!1 G9 M5 p9 Y% ]
4 z, {; A, \9 L9 F& ?$ N
    networks:{0 F6 T4 `0 X$ x

6 z7 [3 K$ _+ e. T. l) i. U; g    development:{" r% y& p& s% p) W- |& ~* |. H4 _

$ }/ M$ }- w! N( S' K/ p" g0 Y    host:"127.0.0.1",$ h% a/ w5 Y& a
+ B& o4 e' ^! L9 G2 B, c
    port:7545,, H3 V% T: ^0 i2 X6 f9 y
# o  E0 Y+ U+ D7 C( I
    network_id:"*"//Matchanynetworkid
% G/ o" h* R5 P
# z0 J+ r3 A  l    }: X/ b. x- {( X" L* P
$ f8 c5 h# L3 V7 M/ j
    }, t$ G- O/ j& e7 j: q8 h

/ R/ y- W  Y  B/ h" p, \' @+ f    };# ~* `2 ^  o4 ]: D# }

6 X( G2 S8 V0 D( J, e    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。1 {  A. I! `0 r% I

1 ?9 t% |' h# b, S% ?! x) b    现在我们准备在区块链上测试代码啦!( n) A, ^* t2 G" ?( y& }# j
" j4 y% u- k' m8 R2 m
    测试我们的代码( N1 `6 o" I5 @3 C

. D  `, V- a9 \5 b6 K$ h! i    在第一部分,我们会使用Ganache。' z7 I) `% q& e$ ?8 [: ^9 \7 z
" f- R# x! b+ e5 M7 q
    启动一个新的命令行,并输入以下命令:
1 S) f- d1 N5 R
  |. b7 j) A: a9 ~' p7 u/ s    ganache-cli-p7545
1 K+ w; F& ]6 y7 T/ k  I! E  `' s' U6 p) x$ D: M9 y4 }: q" U" f( ^
    它所做的,就是告诉ganache-cli从端口7545启动。
! i; m6 S6 o# u% s: v$ J7 {# E! @2 Z/ K" F, D
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
) o* O' @. k/ v- S8 c7 Y8 d, n5 Q4 d/ |- i  ?& c: S/ I
    现在,回到我们的第一个命令行界面,执行两个命令:
; N$ _1 f- C9 {' A2 _! }8 |( t* _' ]& X  D
    trufflecompile# _; @, @' e7 @% i/ i, q

$ H/ q" f& ^/ t8 O8 R    trufflemigrate--networkdevelopment( D, w4 Z5 t2 l9 f  y# J+ h

2 s. A" @& W( z- \    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。8 \/ ]2 T1 |" {9 ]

) P" A4 E3 c  n    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。8 |& W" k$ W4 O) o! h1 `2 }" @& @5 v
3 y: D# K) \$ F' \0 g/ I8 w" \
    现在,如果一切都按照预期进行,你应该会在终端上看到:; h4 F0 S, d: Q$ {- i/ t" b4 L

+ O# n2 O' i5 \( G    注意,这里显示了实例化的Wrestling合约的地址。' x$ f! m; y' Y1 z

( T" {7 W6 Z" q) G    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
% w  _5 d/ {: J+ e  h+ t
9 a" s1 h( F- g$ W6 Z# h" }    注意,它显示了实例化的Wrestling合约的地址。
  o5 k% B. R5 w7 t* n
3 Q, {% q8 M# I& Z( q- d; j4 e$ n    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。8 A$ |" W0 T0 }0 \
' X9 |8 F7 d5 P  L9 Q/ v1 e' `
    truffleconsole--networkdevelopment
$ _/ k" Z9 S) V+ ^# z  }" f, x/ ~( a0 u2 S; x% V4 _
    首先,我们会执行这个命令:4 g) V/ U8 g" A$ Z

( z$ B- x, o0 m2 Q% b" S    account0=web3.eth.accounts[0]2 k( l1 |$ |! q  z3 d; _

; o: q% w3 b4 g* z    account1=web3.eth.accounts[1]2 H& a3 w6 n4 a$ m* Z4 d- b1 E

: }1 s1 ~. ?% N3 z6 l) |    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。, g" f4 h! O/ h% P$ ~6 V5 L4 k
9 M' q* T- h5 a2 I  l+ l1 ^
    然后我们输入:1 L( e0 ~1 u2 ^8 I+ ^7 I2 `: V8 [
/ |: O9 R, ^; m
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst}); j0 c/ \% m! c) w

* S* F6 R1 }+ p/ [& K% d$ }. I    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
  W. w- S2 h+ [  M9 ~
/ R/ r' L  |) h    执行下一行:" |% C9 @, a5 s1 F- C
2 E0 }3 h% }; Q( k9 `- t: P5 F
    WrestlingInstance.wrestler1.call()
4 B$ {+ [5 K9 E: Q% L4 }* I; D6 p! C+ y( _4 }. _4 L+ V* ?2 T
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
- x; H6 t8 n9 T: [8 |) v: K6 t+ `
, G0 @" _; m* j9 p    然后我们把第二个账户注册为一个对手:
" W( ?( r: g  w+ x% W' j  {8 d. \- q, z9 m% p* W
    WrestlingInstance.registerAsAnOpponent({from:account1})6 H8 V( }0 Z8 R" \% O$ M& X
3 Q( N, g+ j& P+ O: |! [4 o
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。
& T8 k) ]5 S! x9 C0 l- q; Q0 D- z+ r$ v. k# Y! v. W- a" H
    在执行这一行之后,它应该会返回类似的内容:
0 g5 G' ?% d/ C% }. ~0 e
" Y2 H& Y) O# F/ R    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。
! T. ^, p% a( \$ d4 I' C# b! ~' e5 K4 }
    你可以通过执行下列代码来检索第二位参与者的地址:- b  {5 b' r, J

3 @. f& s5 l' N1 D0 {3 a* f    WrestlingInstance.wrestler2.call()+ T+ E# ^5 \* c1 i
0 W; ^9 l0 _9 Q
    现在,玩家们可以开始角力了:7 N+ F: \" m$ M' A2 y9 q  C
# q# m  D0 M1 z
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})5 S! G" q' ^3 C" s- s3 a

' d; G( w( f) _/ G  ?    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})4 S& j5 T6 N* p+ J2 u( Z6 R

6 \6 x. i+ \  ?    //Endofthefirstround
( x& L4 S0 A7 _; f% j, _
& v" t5 ~7 G2 ~7 n' q: b    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
( z0 |6 i' s& Q) z
' \* M% A3 M/ C- d    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
  ?  S# u2 H! p0 i( [' f! a4 @  c$ n0 L
    //Endofthewrestling3 m3 l4 u5 W9 [( k9 ^
6 q6 O. r# e$ i+ m  O
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。, P( ]" P1 u) t
9 K8 ?. ?' ^$ A
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。# O& Y) E, S/ x" l4 `1 i7 r

; `% O" m# E- d$ N& m    给你留个小练习:从合约中提取以太币。7 W( N! V% F# g- ^
/ O& ]5 s% L  U' L, S. e# D& A7 G
    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。0 e/ q4 Y8 h) p  `0 l4 t* O
9 n; O8 {2 v( ~7 i6 A4 ]
    geth如何在这个过程中发挥作用, P2 ?6 b8 X% h# ?9 d1 a8 _% I
5 {: B# u$ J0 k: |# [) r7 P
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。& v1 x) A' s1 j5 g

  ]! {5 [: ]" w% F: D- v    安装, z/ U5 P" a1 K8 P0 e5 \

$ u( j$ G2 w3 F, {7 z3 K7 p( K    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。: y. v) B% I8 r, q' |8 m' F& k

! M5 D1 A$ E7 U8 ^2 Q( v    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
; N" c) e  ~' F5 P. A: h) C; c. M7 p' B
3 D( [- K) Z0 _* n7 P! F! g    创建本地私有测试网络2 t& \: U, \: P' O2 b6 ^' y" k

: I0 c# u) ^8 D: t( ^7 J    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。! W3 n" o1 l) G2 t
% y* B) B& i4 t. o
    {) e, q  x: Z9 X* z$ \
( a" g$ r" c  B2 }% B4 _3 j* ~/ W
    "difficulty":"0x20000",
, a" F6 C3 m" V0 k! a2 P4 }( S6 g# T. ^
    "extraData":"",
7 r: h! E; e7 \& F* M
) c' s! f  J: G; g: a  {+ Z2 S5 r' Z3 ^* N    "gasLimit":"0x8000000",
! x: D4 j1 w8 E  x1 ~5 R5 d+ p' i% |8 l9 b. g6 c
    "alloc":{},
8 t/ W, W4 _3 G5 q9 R9 t. X5 }  Y) ?
* G  i$ c0 C# M; o    "config":{* V9 m5 R2 @5 ?* G6 @0 z  t
2 Q  {" ~3 R. E: U
    "chainId":15,/ m4 u2 K4 [5 w$ e* M4 \
8 W6 C% a" ]! V" |4 \* D
    "homesteadBlock":0,
/ I  q0 y. ~5 I1 O
& L& O9 S. z5 S    "eip155Block":0,
9 ]7 j/ M7 J7 S$ u( S
6 f& ]1 Z( Y; Z' _9 F( O' b2 p    "eip158Block":0
4 r2 f1 z! R0 r3 i1 e5 K3 |; @7 Z* w
    }6 t, D  A, H" J/ @9 i+ V. x

8 z7 j" ?( R. y& r+ V# M. p7 \    }
/ p/ J# q0 a# P1 k" P/ _& r. G; c4 W) W( W6 A
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。% Z! k! M/ Q/ D! a

. W! Z" k' m+ C0 k2 M    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。; T' r4 ^8 ?+ I0 t+ |
9 G9 p4 c5 G! c7 n0 \* l  ^
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
/ d8 I4 i" r- {6 Y/ K( A/ `3 W+ Q7 `: W: T' A, @4 _
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
/ T/ R6 K1 y0 D: |% n
7 |2 i" m+ O+ S( [/ D    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
5 H, c' t4 e/ n+ j
5 z8 L0 U2 L& ]    geth--datadir=./chaindata/init./genesis.json  m  t$ N0 g0 Z9 u% y# i
; q4 l! J/ B3 ?& u; |. I
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。5 d% h6 a2 ~& }2 `. v
- D  O5 e& c" E+ v. o) _
    接下来,我们使用以下命令启动geth:, `$ q+ E$ U$ n" D
4 a8 d2 i6 @; K, s! r" V
    geth--datadir=./chaindata/--rpc- L. b4 m4 _# c6 Z$ y* g+ M
( e. n/ w9 `8 ?$ c6 I
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
5 x# t" n: R( r9 w/ v. E# x# h6 Z- a6 i' _  V5 Q
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:) G* Q" M0 D6 V7 x' }. n! Q. _
: Q  C6 T% ]/ h4 ^( t3 A$ }' r
    mist–rpchttp://127.0.0.1:8545
, |4 k% h: U; R' d  H( R# ?. ^  e, G1 r# o& g
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
& D- q: e! T2 f5 H" [* J' p+ {( k
    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
- y  a  M3 U9 W6 r* t( h" l4 y3 Q4 n- ]  a4 o% I2 \- c
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。: H) p7 C# R9 R
( h) G" N! V. \6 d( u
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
  Z8 A# R8 ~, ?, Z0 l# t, ?5 Q' F1 m5 w( ^0 n2 b
    打开一个新的命令行界面并运行以下命令:5 `* M+ R3 U; h+ f* h" B9 y

( K5 s  D$ V4 l    gethattach* E5 x. p6 Z1 d" x
5 C2 Q! r5 O* S6 y1 N0 }
    它会运行geth的控制台,现在我们可以与它进行交互。( z  W2 ]. c' j* K1 z" l4 P8 n7 |

9 }- A  h! T3 l  u; C    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
4 n1 H4 j: t2 G' v: T0 L3 u6 C& p) P) _' G* O% N
    miner.start(); y' @  L8 b7 R; G. f

7 x. F4 d3 E0 r* g  m    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。
. V7 R6 z/ i/ }. a/ ~3 n& d
- T9 N2 b# B* {0 O6 b+ m/ n    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
5 e3 x# o* p+ C. f7 Z, U$ v# K( ?6 N0 |( F8 X9 K
    现在,再次打开“truffle-config.js”文件,像这样修改它:
' C0 Q' \+ n; ~' g
8 j) x8 h" c& G" ]6 u( X7 b) Q    module.exports={* o0 J, g- o, d" p
. R; ^' C4 ~# m: x2 \  f; u) T
    //See
) K+ ^" j1 W8 }8 _; v2 K0 n9 `  |; C3 ?0 H
    //formoreaboutcustomizingyourTruffleconfiguration!
  H/ b5 o' c, Z. I3 x
2 h" Z$ f. b3 H6 n    networks:{) h: t& g. E7 P0 Z

3 f6 P) Z/ S+ a- d1 O( V! }    development:{1 }) ~+ J( y) d
6 x  \4 [7 J1 c- M
    host:"127.0.0.1",
# N# B$ R! u2 c, G3 e& s/ `8 K3 s5 V# x' B1 N/ D1 a
    port:7545,
+ J5 v6 o3 ?8 ?7 X( p  u5 S
5 k: \1 Y- C# q1 A    network_id:"*"' S0 }. E8 r+ |% R% E
+ }; g: ]) F8 ~1 o- f- K
    },0 w8 l' \# b6 ^& [# M! C

- T' i9 W  Q; ]/ C; a- x    ourTestNet:{. W  _0 v. `! E) G4 K
  a4 `4 _: e% F5 O
    host:"127.0.0.1",
8 d3 C" ], m) e! b0 |' n8 c, B8 L/ X
    port:8545,
9 B+ }  x/ [7 W& a7 c2 V1 E$ A! @% p( ]$ f' y7 C
    network_id:"*"
8 A3 i/ Q/ C9 m; b
/ ^; ^7 u6 w+ E" N0 Z; E    }
$ V# ~& Y/ n, ]$ ^% s! e. W: V
3 t3 O- u7 U6 J    }
4 a+ q3 L* B# ^- N& t* O+ S. a& J6 r0 i& F% D  s* M* s
    };5 \* r  [+ x" g( l5 P

& L1 b; p3 ]$ P& W6 s! z* X- l, v! u, q! V    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。
! Y; A; |( H3 ]7 N; |4 g- N; F4 S( ]' p* v7 O
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
: N6 L* A8 z8 `( M0 l: C, {
- W/ I5 f7 g: h) R    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')" K  o$ B: O7 r: [9 ?3 _1 ~

5 R8 f. b/ C" H6 b* f5 O! }3 C    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。/ u- C, v% Q& l; ?& |  T# k
5 m0 N* W1 ^; w! C. ?; }
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
# P2 X+ y2 k" X8 N# w8 S6 \$ z6 _  X  N) D! l; o' S# _
    trufflemigrate--networkourTestNet
  A# t4 U5 z' j- y4 S. U6 Y( S5 U1 i% s8 Z+ r+ t5 i5 {
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
4 w/ |! ?! e/ R' v7 m4 @7 T) X3 e: i7 R! j
    现在,运行以下命令启动Truffle控制台:, ^: l. d  V% q1 ?
7 ~% N; B0 ]. |) F" k
    truffleconsole--networkourTestNet: ^( T( c3 Q0 h+ g& c# c" q6 {: n

$ `0 H! o/ B# F& r/ i    然后运行这两个命令:& _; N! M% k' o$ L
1 \% s6 _: P- U  J2 Y  C0 |
    Wrestling.address( y. S; _. d" a: R1 J
+ n- I1 G& W) E8 b! H& p
    JSON.stringify(Wrestling.abi)
3 \2 Z: b' G1 S4 e
3 W+ V7 c4 u# f& h, k; _. C    你会看到这样的输出:
9 l% o. o& p9 H7 K  G, E& ~$ x; x) C& }. m2 m) V: e
    第一行返回已部署的Wresting合约实例的地址。
/ i. t/ J! w7 E3 S+ t7 Z' x2 w2 I4 |' G) ?3 D( N7 `6 u+ ]" X) L) f
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
$ H  r! O4 B& }: f* @* o  f' @6 J" Z3 D( z# H% Y  E" \: Z
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
! o" v$ ?8 m* H8 S2 F
; L. Y$ z: N) k: |& r; |8 H3 |" }% f4 U    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
1 q2 b6 C3 w7 a: @+ Q; D8 Q
& e+ i% [  B) l9 v& a  i: y2 S. O- b: i    然后,复制之前部署的Wrestling合约的地址和ABI:  {) _) \* E- M7 a2 A" ?

! u* v, P" v# z$ n- n( ~    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
9 K0 ?1 G+ m: E# H0 u; O0 S4 U: w: b7 k, Q1 s* n9 Z/ Y
    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。3 z/ u' s0 u; q1 B/ \  c8 u" L
8 I* m' f8 c2 d" M0 N% D8 U
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。5 j1 Z; w# y7 T9 G( }

; w3 @$ b! l% l; \    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
% i$ V0 F! \) h) @# c$ O0 `0 s9 K  V! l+ h: s' S* m9 G/ a
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。/ r. q% B; l4 s! s7 O' O" W  a2 B

& j, v# `2 @: t" i& Q* b; p6 v# l6 f    本教程的资源库可以在这里找到:
8 q" q: a. `0 H4 N
: O' y) N/ J* c% J, Z    devzl/ethereum-walkthrough-2
8 [, N  W2 Z  u* |: v$ u
4 w& y  J% L- C+ U- ~5 p' ~& Q    总结
2 E, K& C2 i0 ~" M$ X3 o5 t& Q5 w- y
6 m2 f! r) o! j8 @% P5 T    我们已经学习了4种开发和部署智能合约的方法:+ e+ `# Y1 j) K" ?9 }- G+ k
  K2 J" X/ c- R$ D; H' V( p5 I
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
( T; D7 u4 p. u/ n5 N0 S
; v& O" q; K% }2 S    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
* C8 p2 a: M. u9 }3 R& Z/ R1 [7 ^6 q' k0 P/ a- R1 n; G
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
& D! d7 W" N( ?9 R( m3 w, g  \$ x1 Y; s5 `  n
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。& e& y0 P* w7 ~5 Y/ i  ~5 H

# F9 d0 \% O. b8 q% {2 s' K4 f4 O    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13