Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:0 l1 I6 E: v0 `/ \, k. r/ L2 ?
6 ]% T4 w# L4 Q8 m" m/ Z/ f
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
9 b- D, T' q+ s/ Q  q5 R0 E& j1 G  k, k: u9 S$ F
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。- d0 V* f/ R: K
$ Q: U6 Q. r, Y9 Y
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
8 y4 G1 U1 v* E/ {$ I/ C
( x* s: `2 H5 ?    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
: O- [5 ]8 T: A; l
. E2 ~2 B' W  Y+ d3 D- X    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
! A$ b, q! }9 j& B. E+ N% j  z8 ?
- x) {, C4 C0 N3 {    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。: D' _. N% Q/ {( S! r
# J' P& g5 d; o9 Y
    安装
8 h/ A5 b4 J7 o0 n3 H
2 v1 B, t5 U/ p) v  @1 ?    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
6 g. ^; K8 \& y; v
( N+ \7 D' R$ n  K6 ]    Truffle
! z; ~# ^; s9 N- N( K# J/ t$ J% ^, {% `4 G
    打开命令行,并输入:9 E9 K* L* D7 i& h4 ]! j, _% X

7 {: ?) V3 D' H! Y    npminstall-gtruffle
+ t9 T3 _) ^5 t* _/ t# U9 }. s! O
    如果出现错误,建议你多阅读有关Truffle的文档。
' P& p6 V0 N+ d( ?  Z$ P8 s: q# M' W/ H) G
    Ganache
, v5 j% z; M$ [6 g: G8 D
% o; H" i: Y. p6 K    然后,安装Ganache的命令行界面:3 c, _: n! G9 C

% h' a4 p3 Y: @5 T; N    npminstall-gganache-cli
5 S# ~+ c7 z) V+ v* ]8 o5 q
" O/ t4 L; ]  h    如果你对此不是很确定,点击此处访问Ganache的Github页面。
) Q2 ~2 I' m! Y3 f: v7 I! R5 d) _6 Z3 ]4 H; Q, h) @" M
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
/ x4 x) m& Y1 W. b( U- Z
/ \# u3 F7 e* {4 z  A. h    开始吧) E- w8 s( q$ y8 P0 K
6 Z2 L, i. q  q" i: \8 `% Z: z
    首先,创建一个新的文件夹,并输入。  m5 \! r3 d$ z: L4 P% t

, ?1 \5 ?! ^( y' ], {4 g" d0 t1 o/ T    truffleinit
4 i- z* _! u) i; u: J9 r3 r& s9 o7 [( s6 R
    它会初始化一个空的truffle项目。
* D: l8 D  x0 m( ^7 \1 Y7 P$ `! Z
    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
& x. `. ^6 n, k' _& v( ?/ V, o7 P/ a% r
    将下面的代码粘贴到里面,然后保存。
$ e# q  p0 W7 K3 _( S$ o; L. Y3 |1 q. `4 L
    constWrestling=artifacts.require("./Wrestling.sol")
. Y6 Y$ E9 d! u
$ J( h/ v# w1 R    module.exports=function(deployer){$ o# b- V" c, l/ y

$ L. {  V, v  g8 z" `: t5 O2 v    deployer.deploy(Wrestling);% g* m' e& P0 j0 x) D6 b- t2 _5 r& k

: w& B/ M7 z( t    };7 z8 A& ]; J* l* `$ d

' @- s, ?! M- x& W; ]$ j7 m    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
- ^; @/ X2 Q( U$ \
* V9 F, N! h7 [: n$ O9 B    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。% K+ y) W" U1 {+ v0 c
4 n; ~" K8 U! ~: {! f( g0 t
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
0 J8 x* O0 B) V- \5 Z
2 l: E. H, v( a1 `. k; J5 ]$ I5 j    module.exports={$ l6 @' {' B! w! o9 k- @  c0 |

, h- W5 ]3 b$ F/ ~4 S    //See
+ K  H  n7 ?3 N9 ~# x6 N. ~( U% g+ _
    //formoreaboutcustomizingyourTruffleconfiguration!
0 F) O2 \1 i, T/ k3 p% w
# n/ b5 H! X1 A    networks:{
" s9 \  k% J) M/ }- m: [1 B
* s. d7 ^! `. F' p8 H# ?' H6 f$ d. P    development:{4 ~& |# j7 s$ D2 V+ i7 S, T' K  ^& `
- T# {! y& K% K( b' \* ~
    host:"127.0.0.1",
2 f2 ~7 s, t' h- n# P! W8 p
0 n- P# k& Z* V- w9 T4 t    port:7545,
, p3 q4 k( u1 G, M, E9 i( U8 f0 I
    network_id:"*"//Matchanynetworkid
* f; {4 H, z6 w/ d5 J/ b- A1 U0 Z+ P. K) |8 q
    }# d" X) H& [/ f9 b2 a
, o  o6 T6 H) }. _) e: ~  y
    }& U7 _" l" c$ Z2 G6 R& k3 N. r

! N) O0 U! E# e. A    };% b3 k( o0 W! q( j2 {, @

; h. U# R$ ?% G% c3 T0 I  j% O    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。9 I6 y7 y+ {% w2 Q# \$ R

( E$ w4 R, y# [) j7 D  x( J    现在我们准备在区块链上测试代码啦!0 o3 y; Q8 Y; v& ^

3 ?- k" D% t3 U0 w5 \7 G    测试我们的代码
- H7 m5 W4 p; c0 _
* G" b  I2 _$ s+ f) Q8 {5 C( t& D    在第一部分,我们会使用Ganache。1 M. z- a  E* d2 K5 D

8 R7 Y; C) \, A7 e    启动一个新的命令行,并输入以下命令:+ k/ o2 h' b2 H+ {# g$ u1 s) \
8 Q; Q9 b- M- c9 g9 K3 G. U: R
    ganache-cli-p7545# [( @7 u3 S) K% D
2 B" X! ?/ Z! c. F
    它所做的,就是告诉ganache-cli从端口7545启动。
1 z8 Y8 h; O% I' F- L
  S! h3 [% f6 D5 A1 k: Y    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:- W/ @& h( _: f. j2 V7 J" M0 Y

8 t( |* ?+ `' w% r1 G1 L( h) B    现在,回到我们的第一个命令行界面,执行两个命令:
! L! U! k0 g# U1 n0 I% z  a7 l- N( d( x
    trufflecompile
0 e' W  o0 e5 H0 q$ v' ^) e/ @: K6 C: j8 Z& F
    trufflemigrate--networkdevelopment  M, S1 y7 W1 z3 p3 r! Q
( [& D& p0 m9 C5 ^! j8 Y
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。6 o# X  B9 Y( T4 w4 n! u& @) b

2 Q1 i' h2 V5 T8 f+ {8 \    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
" H0 ?- q; Z1 U: V( t! z7 ^" _9 m. E5 J' f
    现在,如果一切都按照预期进行,你应该会在终端上看到:
% g4 V" k6 Z2 f/ g1 k/ S! L4 U4 Q1 b5 |" y3 s
    注意,这里显示了实例化的Wrestling合约的地址。) r, x9 {- ]4 ^6 }3 _. _) P1 Q- g  \$ C
* b+ B1 N7 l, j$ @2 R* t! x! S
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
) P0 g7 y* F' @- R
# Q& c) q! Z  g# k7 H+ O. y    注意,它显示了实例化的Wrestling合约的地址。
& K' F, J) }. n0 R, c1 e: i/ U+ `, T) w' M, ]- j" p1 U
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。6 y( L/ T4 A# O. M; |# K2 A
/ D; R6 j' p, y
    truffleconsole--networkdevelopment" N9 o* C2 T# F+ {/ _/ _9 q

/ ^; r& W$ \# l  B    首先,我们会执行这个命令:9 \( S' e/ J; m1 d: w
$ b9 T5 `  t; G9 B
    account0=web3.eth.accounts[0]+ A1 ]9 |2 B. r  W, I- z' J9 I8 s1 x

. V" p( _( P8 ?- O1 z1 j    account1=web3.eth.accounts[1]
" k$ N' U- m0 c, \( u6 D( t
) \* b/ W) w, v# q4 d! K    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。6 o5 }2 }, w: _% ]6 S( R. [0 y
6 G) p+ V! X: i
    然后我们输入:5 ^6 V1 q2 s5 U/ B$ s
5 G/ k. M' H, m0 d( v& q
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})2 ^+ G6 B+ V7 V: i% ?3 }
% j9 t0 F/ I8 i1 O
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
8 L6 r/ E5 R! F* G* _
# j( g* K( E1 u4 N0 k0 q    执行下一行:) t: s& e- g6 O$ j0 D9 h+ I, [
0 m$ \6 |& j3 A: W$ x+ [- e# y
    WrestlingInstance.wrestler1.call()
& e$ |% [  `) I' Z
& r2 ?  x3 E8 d% W  N" _9 C" J    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
9 @* f, O$ d! Z" L" L) M. J( O+ ?/ b/ c0 J& E
    然后我们把第二个账户注册为一个对手:. f+ @1 k& Z, G" {; C

/ w- j8 x! U$ N7 f    WrestlingInstance.registerAsAnOpponent({from:account1})6 j' g: F/ N- W+ a6 {' y" `
! V& G1 k# o7 T' Z$ q. S' \
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。0 w# C( O$ i! I! V, u& a  e

! v" T; j- O! q, G& r; R* M    在执行这一行之后,它应该会返回类似的内容:1 `9 p8 I6 {. v% k  r5 B
! t0 }$ _7 I& H1 U4 \
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。
( B2 c2 N( s4 j% G7 f- k4 |$ ^
" r9 `7 f: \! q9 i, f# \    你可以通过执行下列代码来检索第二位参与者的地址:! X2 A5 o7 q& U# J" ~: S+ a1 [, W) H5 z# ]6 p
' o9 |( r" e# G, R+ h2 [
    WrestlingInstance.wrestler2.call()3 s" ]  R! M6 b
! @; w2 X1 z0 e4 N) V8 e
    现在,玩家们可以开始角力了:
+ b5 H2 A; t# |; \' h6 Z
5 v% m6 Q) N" z( ^/ q1 [- u    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})8 f2 {; E7 s  o8 q  l& B

% O) W3 j; r2 U; @! Y# B    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
5 p0 `9 {% _  R# o$ k5 }- @5 |
    //Endofthefirstround
8 ]) l, P" X3 y* `) v/ [
( C" ]' G2 F6 l& M! ~6 N7 I    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
2 n3 y. f% {! k
9 T  e. h, p( `0 x; m0 a7 x( d3 P    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
5 v$ Z( Z) L0 q; K
; d; w4 Y9 \( f8 f" N    //Endofthewrestling2 Z& W3 e5 J. m! S
7 [% W' z/ a3 R7 K; c' K; n
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
) a# }0 S( k7 b8 h
3 ~$ S7 ]3 j2 [) |    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。
, o9 S0 ?3 a5 S3 m! y# x0 a9 A8 e: m- C
    给你留个小练习:从合约中提取以太币。2 z9 f) D9 F: a

' O  O6 F1 {2 {5 D" I( ^' L    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。5 j1 `) N8 P. v; c1 f* l% S7 K
8 p7 t3 o: `. g) g
    geth如何在这个过程中发挥作用
. g5 \5 e& x8 ]4 P" K$ _3 u
0 _1 Y1 E0 u" ^    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。7 P( b; L7 ?/ D1 z5 f7 d4 p9 w; c
+ l7 a8 U, ~$ L- r+ l* l2 W
    安装
8 T0 N6 \# n/ p$ h
# I/ R! T9 F- r) ~    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。% h0 [1 F* z0 J9 Z# h/ N9 W

5 ], S* K1 H1 Z! F6 B8 ~6 s" E0 q    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。* p. H1 T# \) ~& J) S8 ~$ l3 s

$ G. i8 z! p6 a& Z    创建本地私有测试网络! {% k- x3 B  q0 `' d* O

% `* \' p, x' Y* F& C1 }    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
. A6 ?5 b. ^4 e+ R0 K# K
& F$ n% _/ E4 t9 [) h6 \$ e    {
! n: `- Q6 e4 L. [& z6 H& h, ^6 S! G( j/ s* z& ]/ |
    "difficulty":"0x20000",, {& u2 X/ h$ h, D

1 s" j8 r, ]/ A: _  n# ~    "extraData":"",
  _( j4 P0 B6 q: N+ o  E+ g# L8 F
! ~7 R( j% H+ Y2 F5 J9 E    "gasLimit":"0x8000000",
8 B) }& P8 U- S$ R; B5 L: d* L6 c7 Y
    "alloc":{},
5 D3 s) F& n6 W  x' i9 r4 _1 q; g1 C7 j/ U0 D( ~# ?3 @/ [
    "config":{
( N* ~. G! D$ ^$ C9 L
5 j; F+ G  @+ @1 ~- W% |9 c    "chainId":15,& O$ u: d( @( C, a, }/ h; s

% g+ d  ?6 l; l7 x# ?- e1 T2 k    "homesteadBlock":0,
) D3 I" x, `( \  }' B
+ Q, ?' g# S) N0 I    "eip155Block":0,
2 Z' r- M8 |, o) b9 _+ v1 i* r. B( A2 q& Z
    "eip158Block":0: K5 w( W) X, ]/ \

' P/ [% c3 u5 v- J9 [    }
& C1 f% m6 M- [- o; S
1 h6 z8 i, @% C6 P" K$ P$ b+ D6 Y. D- U6 }    }
4 ~7 f) T! z" x2 K6 w. ~& M% d3 U% j; `1 o2 R& g
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。4 d2 _$ @+ c! h) H( B
' ]* O- Y* B. n# o8 m3 n- k1 L
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。; A$ m0 g7 c% b  v2 R  R2 J* b
0 \  V9 y5 i; e0 Q$ a- m* h2 U
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。8 }( `1 ^' T9 I3 M8 J* i$ |$ h
1 I$ x" P. a& ]8 T
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。6 m% Y1 @: N* }; _3 f7 U
. q& L- ^+ Z4 A
    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):7 A8 R. g! U7 ~7 F: g
% y! D) s( |( v  h4 b+ M
    geth--datadir=./chaindata/init./genesis.json
5 m; G( q% W3 s0 y' v' Y6 I+ M: G2 b- S1 K2 C  [6 U$ i+ k
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。: w6 S* M; I5 v) n2 h1 Q

3 }  s( g) n2 f- j" F- o0 ~    接下来,我们使用以下命令启动geth:- ?4 ]) r4 ^; S

) c$ C; B5 i( J  G- L" N    geth--datadir=./chaindata/--rpc
0 w0 G. S$ |( T) R6 q- A: O. x6 @/ n/ I5 C) c2 I. Z. `% E- J
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
; r5 ^) A" ]3 e* ?: W0 I
2 v- K: _4 c8 C( ~    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:/ C6 H2 L3 j# x" q" u2 u( O- F

7 W7 r) h) `( w    mist–rpchttp://127.0.0.1:8545
1 L9 G; c6 v: e( s! }* y
% r; ?* `% c& y7 d" y, G) c    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
6 a9 {0 {3 \# S
7 T$ v9 N: f. M' @/ W0 u" N4 D, h    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:, M7 B+ F# k$ ]! A( O
* O/ k9 S! c" E; }8 Z( a  x
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。1 D1 B7 O" z! @! [. y
$ W, c1 W- O. G& [6 W' C
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。7 y& g$ \$ A5 W* Y' a

$ I5 G: S) B" w7 o- |    打开一个新的命令行界面并运行以下命令:
- A  @; u9 G& u% @% v4 A: J
; B5 w. X, N4 R. P" ?! |3 U7 T4 I6 l7 y    gethattach7 y2 l5 T; F: y! \/ P
# r- X3 z! t% F' i3 x1 O, `3 X% G
    它会运行geth的控制台,现在我们可以与它进行交互。5 T% l8 Q0 ]" \+ E) u' }

: v3 n1 s5 w8 W& G: y    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:% c, ^2 }, p3 U1 p$ S/ V

$ @- |/ }1 r- u    miner.start()1 ~, e) y  B2 x7 f$ x) `9 K5 C
1 u3 E* F* ^8 A5 ~% y7 W! W$ |/ n
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。8 c6 O$ Y0 |' o& [  F- {& T; f
0 z; q6 U3 ^! R+ g( T
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。7 s" p* K5 d) K& W8 n, O9 ^+ N
: i( r# B0 T. b2 j  T3 t
    现在,再次打开“truffle-config.js”文件,像这样修改它:
5 H! a1 Y- u6 w9 b
5 ~* E" W; E. G" p. K- `2 h, C5 Q# U/ r: H! E    module.exports={
, S' _4 f  o( c' V# z7 e5 O! H/ S. P2 j
    //See$ M( r" D* ]7 r- ?5 V( K  m! {

; D6 \. x& [  T    //formoreaboutcustomizingyourTruffleconfiguration!
3 G: f) _) r8 s2 O
) z; p3 Q7 Z% F' \! e    networks:{
6 a" @" J  X% f. `- W0 G/ b1 |& F+ w2 z9 Q) b
    development:{
- F+ n, E; C4 B' [' o) ~
+ u& |9 r6 v1 |- i7 b  |    host:"127.0.0.1",) i4 \: }/ q3 F) s, E: L
3 n" c. \6 D  _# f; v1 M5 d
    port:7545,! n" p0 T' i0 f  b' g+ o8 r

. _7 s: c# b) k7 U6 e% j2 O    network_id:"*"7 K% G, a4 ^/ f" k, t. M
# U* ?9 W. N; c# r1 h
    },$ m! A, x, j% |0 ?

+ Y' w! i6 }; q+ H2 }    ourTestNet:{
2 |: U: w9 m9 Q0 p) r; M' L( i. e1 {* f  `3 Z/ v
    host:"127.0.0.1",
8 N3 M/ N7 _* q) @/ [9 ]
3 |3 G/ E/ _! v    port:8545,
! X; ?' _- a3 h2 a7 w& ~* Y7 B1 p% P; W! w  w& m9 G# J; d3 M% m
    network_id:"*"5 V( Z: b/ T) V3 f0 L

. {: j7 j" Q+ Z! n% w! U    }) \1 t0 l: X1 m# X& O
# X- x1 I& N+ j0 E+ R/ H+ d
    }3 T- u1 |* o. ^

0 @$ ]/ @0 z% l; q+ ]+ `4 {2 D    };
" Z' Y' ]0 d  a4 K
: f1 F9 n' t$ c. d7 b    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。1 W1 ~% c, l( G7 \# V
; A6 W; i: s2 |
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
$ f# J( \" s7 h0 p: L4 Y# n$ v# A+ u' P
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
  Y2 q: s2 b( l7 j
9 T$ y% d6 c; A* j    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
5 Y2 M$ D$ U( X. x! _% |9 O% s" V7 `& W7 l6 a# \2 L8 T( _* W
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:& R6 r  ^+ P+ d2 w& e4 t7 q
# f, l9 A& n/ O# ]! b: e
    trufflemigrate--networkourTestNet3 ^- z7 O3 W6 N
- C2 r$ p5 a. c, W- _4 ]+ j1 Q
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
$ `/ D! I$ j* Z- H* t* l2 ]6 Z" ^( [& M" d) k4 E* H1 l6 C
    现在,运行以下命令启动Truffle控制台:
1 v5 R' F0 {/ p1 C3 g8 J1 K+ k& F, v
    truffleconsole--networkourTestNet9 _, ^/ z* T5 G) h4 L$ U
5 U# {, h( d9 o  C
    然后运行这两个命令:4 q( G2 _; u  Y4 n; M
8 q, ^; b) |: }2 J
    Wrestling.address
. ]7 u2 D" j6 j% ]- n1 ^1 k* ~
% f" Y9 s0 R1 N2 ~6 T' l- D% D% l    JSON.stringify(Wrestling.abi)% {. e* W- r4 F4 c* z3 l
- w7 B% [3 E9 K0 J& x$ i, A' o
    你会看到这样的输出:
9 j) y8 C4 i' i6 E2 |. \' |; i2 c0 S% {  C8 q3 e% t
    第一行返回已部署的Wresting合约实例的地址。
6 e' _: g) c: z5 P" b6 L# n
5 O8 I/ v/ C  ?( r8 [& T1 C: r/ D# T    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
" R, p# C& W# c. n  q% H! C1 C7 }
, N9 r5 {5 M! g; U0 ]5 F    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。! v( r  p& L: I4 A
: ]) a( A* n# Z! Y
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
& G6 s- E& h4 i5 O
; o% n0 l& m5 w) j- q! l    然后,复制之前部署的Wrestling合约的地址和ABI:' d4 u: }# \% I& {( {9 R- F

. g- a  b( a3 m9 C    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
) g. d/ \( ]7 q* ^& e$ v" D# x9 M
$ v$ p" j& i7 u    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。! x" @  B0 \( p4 E2 I

. d. F1 N% Q  V2 Q    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。) K4 N( T: q; C3 w  C! R
/ \( \4 ^/ T4 `0 l9 H- X
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
* N% a: |1 H7 R8 L' d; p
8 d0 U/ y7 F# Q8 o0 N: E# f    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
" D; n/ T- {- w) p& j7 ?2 P' H. q6 V
    本教程的资源库可以在这里找到:$ m$ s! v+ h- c: s- d9 b& c7 K

( P- e; Y- \! J3 }4 u& k    devzl/ethereum-walkthrough-2  b0 _+ c: a; K3 U" Y4 t
2 ?1 ?' s8 x1 t, l" p* o
    总结
  H5 W' Q9 c& E$ J4 L, ]6 [
! F* c9 s+ P, _, J# b    我们已经学习了4种开发和部署智能合约的方法:/ ^* p  Z2 T7 h: d  r

0 F5 R! m6 _% E) H' o. Q3 g    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
1 s$ [! p) @, L; V4 B5 u3 j2 G; E8 H. t/ [# {2 j! U
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。5 w4 N0 }1 L& Z) M. ^2 C1 U

' h1 I- d9 P+ ~/ U    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。2 I/ \% p! {5 E8 `

; N. l2 W9 z& P$ ^* w    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。, D  \% f  a& q" l" r9 `
4 T" b! L( u/ @/ t9 S" f8 x
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13