Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
4 W3 k7 [( ?6 ^! f; A$ S
8 S# g+ z6 j- x    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
& E% q/ s! B3 N2 Y/ `6 n. g1 n& q) |
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。# G3 U; P! a. t* r% z9 ]
) H- ?1 H, r8 y, l) M
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。% S( w3 W1 @2 Q1 X9 E3 D  e, e) }
1 [% N1 P" O8 S0 l7 Y! W
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。$ ?% C2 y/ H+ S3 P

0 f' A. {" ]( ^! k: A1 r    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
( _5 v5 L  M$ \/ H2 r" `- x
& t8 }! s/ b7 W+ ?) ?) v    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。7 [8 b- L$ g! L. e- S& W- d2 |3 m

0 ~2 q  X5 ?- R$ R* U) T+ |: \    安装1 a6 H9 ~% \: I

' {, E+ E" `& k8 ?    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。' ~, W" G6 y6 t- y9 v

# V' N) ?2 _# d    Truffle
, q) g9 g; W3 Q5 H4 M( v, f
5 Q$ f% ~. F3 B/ R    打开命令行,并输入:
9 u4 l. C$ T% T6 R1 E, ^7 X; q
6 T( f6 M) R' c( O0 ^" X2 G    npminstall-gtruffle
1 l9 h- O& e+ I
' m: v& \, C. D    如果出现错误,建议你多阅读有关Truffle的文档。  r9 G- ^- e; F' V

# _, A4 _% y" S3 K8 J1 J5 O    Ganache
8 T' H+ [4 h* H  S
2 d! K2 N1 K* G8 ~/ V4 O    然后,安装Ganache的命令行界面:7 c/ p9 e& d  B+ ]9 A0 Y

! E5 A1 w' }$ D( ?9 s) X; P    npminstall-gganache-cli
  U4 q7 k6 g4 S# y4 f4 O" C% g! w( V- l0 H4 P
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
8 r; G' F) f/ O! K# C) n5 q5 ]- d3 I' Y& ]  ]. C3 {7 Z, I
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。  O+ }* U: ?, t
7 o0 a4 K+ c: g5 U- P
    开始吧
: r; F6 c/ I. }6 q/ [4 y
$ I" V' i& ?* @7 J    首先,创建一个新的文件夹,并输入。9 w" ]; j$ s6 r: b* i
' c! `$ ]6 U2 `2 l
    truffleinit/ o, @3 g% L, D# q0 \: c& S$ _. A
3 L# c, c# n" E# h+ Q% b6 f  K2 [/ h$ i
    它会初始化一个空的truffle项目。+ L# B1 l& _0 ?; u4 Z4 ^
2 }4 e9 _8 e5 |; ]2 K+ S% @
    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。+ E1 f% h6 j; i. J$ G7 a* O
, x3 K4 n' J% C* i3 T
    将下面的代码粘贴到里面,然后保存。, k0 x) D) A  J" Q% }7 _
9 z. W/ q& U2 U. ]6 G( L7 r
    constWrestling=artifacts.require("./Wrestling.sol")+ G( v( s# x  _  `% h+ |3 D
6 A; R9 W9 X' i
    module.exports=function(deployer){
# ~! W/ q. T! n0 ?% ?/ }* k
: P, ?9 Z2 e2 b  ?. k    deployer.deploy(Wrestling);
3 h7 D3 x. ^8 h7 Y: Y, l/ s( W" y& q  [: o3 T
    };
7 V0 u7 g  k3 F" s  H$ b
, H5 J$ f8 r7 f1 ^    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。8 H- u5 t+ x6 C. x2 @, S
9 A1 v6 }0 @$ t0 C0 D
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。: Z1 u3 o) o4 B) f

/ m) g% r( R1 n. t2 b4 h: D) U    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
, P5 R# P* L/ [$ |. _- a& C: C4 V; p, u8 e$ p; t% g% f' N  ^
    module.exports={
/ s4 `* o  I4 a6 F; m9 `" q6 l& O4 F2 s
    //See9 ]( `$ A' M2 r& f6 E/ Y

& I" m  o8 |" b# @7 U    //formoreaboutcustomizingyourTruffleconfiguration!
4 ~4 m: Y8 Y6 X" ^& @$ [* l
  r+ h. P  Y& A1 n    networks:{
% i" a7 m* H5 e( j2 @* [% e1 B) H3 {& A. v2 i  \5 G
    development:{
) L+ H  k+ d# j/ D1 `+ v% T9 ~$ ?9 t7 F
    host:"127.0.0.1",
% k& q6 ^/ ^/ F! _% u! C$ R+ b8 {% k" ]( {8 X, p
    port:7545,
8 {% l( o, L( [3 V. ^  V- X. X6 m+ }4 O9 `/ |5 E- _6 i, m
    network_id:"*"//Matchanynetworkid
- @9 P* `& W, k+ Y0 W
# w3 w9 Q$ s5 ]% ~    }' h, X- q$ l, }) B. A" ?& F
7 C9 K, [  S  p2 B2 k" R1 S
    }
! ~8 T) r: T, m/ F9 \! |2 G1 w' E" S% t; B- f/ \6 }. W5 R
    };; `5 t2 t% N' c% A
6 S3 K1 |% L% W) M: {
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。3 _0 K$ N: R- S  D1 x7 d

9 T1 m* C' B, \& i. i: \0 i& S    现在我们准备在区块链上测试代码啦!
' \# G& {' Y0 Z/ B' k, {
. U5 F* K0 @0 j1 H7 s+ h    测试我们的代码
, D5 p  f9 n+ ~( |5 k: @
# K2 o& m' @4 F& k1 R' \& I; y    在第一部分,我们会使用Ganache。$ N5 q( u7 r/ G# P" ^# _6 }& x

. X/ j2 ~* u' i0 k1 P/ `" r& I; L    启动一个新的命令行,并输入以下命令:
3 k/ _- m9 G9 i! S& B# _# L
5 O0 I2 Z1 x* p5 i' \8 x  ^    ganache-cli-p7545
/ Z( x' B7 v" o: n3 M# e
9 J9 W- x) J& q; v7 W2 ~- z: L    它所做的,就是告诉ganache-cli从端口7545启动。
. V# K6 V% N/ v( \% {( [8 K) J) o! G& \5 l
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:! x5 X& W! T2 o0 K6 [' z
% w& o! |+ X6 G! f8 T
    现在,回到我们的第一个命令行界面,执行两个命令:7 T6 h+ b4 ?( s3 {  E. w
  V. [& |4 |/ l6 J& v6 R5 s6 \+ j
    trufflecompile- Y4 R8 ^- [6 n5 }* J* e$ g' O

7 u) ]5 Y0 Z5 Q, D/ |    trufflemigrate--networkdevelopment2 @( e4 J8 f, X; ]+ u

4 m% B. |7 x1 g( b    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。6 P. w$ b  z- b3 u& f
% o- `  Q5 m3 @9 b& k' B; r5 V: C& t' @
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。( U( h. G. W- D# L4 b
: R0 ^4 M7 u/ B
    现在,如果一切都按照预期进行,你应该会在终端上看到:: o) f) f. d2 A* v/ C; k' I% N
6 Z9 n) {( b  s. x% B( G  o
    注意,这里显示了实例化的Wrestling合约的地址。
1 h; C( Z- P, @0 r: p; \
/ _# ?  s. i( R3 D4 u1 w) ~    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:& G7 h0 w2 v3 N, e8 V/ y( a& \

; y. a  g  i9 e    注意,它显示了实例化的Wrestling合约的地址。
1 X( k- }; \1 t3 E9 k. ^. q' m
- T& F! L4 l/ w7 L    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
2 b  w$ t0 M5 s1 K- z8 W% \1 n* h
7 D3 x+ x& Z' ^0 z7 o3 N    truffleconsole--networkdevelopment" H6 c: ?- p( ]

  ~3 h' P* t" e: r: J" _    首先,我们会执行这个命令:1 ^4 F0 W$ R. k

/ ^2 ]3 ?& `1 y' e) D" Z    account0=web3.eth.accounts[0]/ i1 m& m' z7 v+ S# c

& @9 I* L2 \$ m) e( u$ @( G    account1=web3.eth.accounts[1]% X# j! y% G' q

. N" ?& q% ^3 C0 J, C    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
) V( i1 Q3 {3 c3 U# x1 J' W8 |& h
5 Q% o5 O  p/ ?    然后我们输入:
, t. x4 x4 u% t) |
/ m4 P. y, @9 L2 ~    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})# b( u1 c$ E; s
/ ^0 E2 V4 g* t2 g% p
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
. d. ~: n! O8 W0 q# C1 |( z9 o
  P; J! M% j# j% Y    执行下一行:
6 `( T: M3 p5 W' \
+ {1 }) m# X" w; T$ b4 q7 |    WrestlingInstance.wrestler1.call()+ `1 a' Q9 Q9 `" P
9 |0 P8 G) D" S2 e& M; O6 V
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。% q8 P% G* }9 u8 k* V* I9 J# r
3 `3 Q8 y( {% n) `( @6 r
    然后我们把第二个账户注册为一个对手:
, b" d3 a4 \4 v- l' T; |+ l3 d2 S0 b+ b7 r# Q5 u# j$ i: }
    WrestlingInstance.registerAsAnOpponent({from:account1})) ^% @. }: |6 p6 L+ S

7 |7 u# K3 M/ a5 f. e    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。
" l! m, j* j% K" e8 C5 t6 C7 [* f% k! o% X
    在执行这一行之后,它应该会返回类似的内容:4 U8 A! L' Q& k& q# ?4 j
9 W7 K8 d) f& A# B$ O
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。
+ s( d# e- I4 F$ T: m/ }7 T- Z2 a- E
    你可以通过执行下列代码来检索第二位参与者的地址:0 s7 m+ ]. V! Q
  {* r2 ~7 J( e3 _* |
    WrestlingInstance.wrestler2.call()
7 U1 F+ {! {9 {
; l3 Q+ q( B3 f4 ?1 K7 l$ b    现在,玩家们可以开始角力了:
  C6 H9 {. M( S: N1 g* C3 l. x( g, Q1 ?+ H9 F+ V: K8 P) I
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})' K# B% s$ P) e; h1 T8 G
  V+ T4 K. m9 L. Y$ R4 \
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})) V+ h/ y, C0 W1 Z" X0 c  g
+ k& I1 M+ K4 @& R
    //Endofthefirstround
5 B. ^9 O' Z9 U! D( f* q2 ]4 U, E1 W+ B7 g" Z- g: ^' [
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})  s; f+ J; ?- H) Q! H; g2 B

  U( x# ^8 t9 I( o$ [) g* `    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
8 g0 j& y. `# v% T3 }4 z
) k9 \$ {, b( [& E) `5 U1 p7 e    //Endofthewrestling
! u9 p" D: [4 S& J) N4 V8 B7 O% D+ p+ x, D9 C
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
) {5 b/ F, j9 ]# v# s- S3 V! W7 P+ I0 c
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。
6 ]" `% Q. \7 R; G$ i
% V- a- f! K9 ^1 `/ }( n" _    给你留个小练习:从合约中提取以太币。
0 d/ l7 S* S$ w* a$ W
- M  ?! Y8 D" T) o    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
' K& A8 x* [' {, l7 D- _9 z, C& k+ g( m$ f6 l
    geth如何在这个过程中发挥作用2 Q& O# R; |5 r+ G/ Q+ l3 q

' o2 B+ \* J3 y  U    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。) P4 H6 q& i# S9 `/ q' _2 B

" Z5 i: }4 b: D" y    安装2 |# L0 e/ G* ^! D3 h

) N6 i8 C! p' M* u5 l    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。7 y- G  ]9 l5 ]5 D

/ r3 i2 w8 A5 }/ J" d6 P7 w  Z    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。+ P% M( L  b5 _
" d7 G" _7 x; R) {" D
    创建本地私有测试网络
; \# b7 [7 F$ d8 b/ W4 G# ~
: N& C! q2 y2 z3 _6 z    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
; b( |) v( N, p( ?0 @) T% }
, M4 Q) X  @5 g+ S8 r    {+ Y1 M7 m$ L' o( R
2 Z6 h. g: I. Z- |% `: D, w; F/ I
    "difficulty":"0x20000",( q" q& H" L. J* j. S
2 U' Y5 C2 p, ]$ M
    "extraData":"",
& N! X0 |# R  l+ u4 @# b2 n1 Q7 W3 Z% u9 @
    "gasLimit":"0x8000000",
; m) N; _' s+ d- a
2 `' {- W9 K% [1 c4 p: I    "alloc":{},
' h" f* _" E' {% [# ^- x/ m+ O; H% o4 ^. E
    "config":{7 S* Q  [% {9 ~1 ~& ?8 F9 }# n: }2 ^  W

2 |$ h) m* h$ Q6 Z' Y$ s    "chainId":15,  q9 A% f  M4 S2 @- N) W  Q: X
9 l4 b' P' F% ~& \$ N/ ~: g2 o5 U- K
    "homesteadBlock":0,! z- \. d2 o2 m4 L; n7 o/ [# I
! ~+ A6 P  ?0 v" }/ z0 j$ \
    "eip155Block":0,( |: a) ]. m! B- P

; P. \; c/ |  Z  n    "eip158Block":0& V% ~+ D' U$ Q- @8 Q6 [; [3 N
* X: U' o) J2 u/ S; Y
    }  s  n; Z- Q) x/ K6 x5 W" n
) ^9 S5 \# h/ E+ \( W1 Y
    }
! I- L- |$ f0 b/ C: {9 i' E9 A1 e' R4 ]5 J' L" V) _% \
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。3 {4 V& x/ T' J! O  d) r' T) B

6 p  W) M# \- f1 I    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。  v1 K8 m- w9 g& ?

0 f' D% R9 Y0 d& Q! i    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
# C! k8 R& `2 R+ \* y# w$ S4 R6 [9 i+ i. a# r8 T7 m
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
! \  T* B% Q; {6 b' p  |
& q) C; C, x' N- L( [8 l$ j    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
. A$ `, {8 M$ G6 s
/ ?- j% P- k1 n+ B/ v    geth--datadir=./chaindata/init./genesis.json
& v9 N% Y, P. Y% M( d0 O$ K, t8 }3 u. S& y4 D" |
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。0 b0 m7 b' K& [8 v' u

6 o5 E9 k1 R* L2 a2 I+ U    接下来,我们使用以下命令启动geth:
2 @, S" t8 j0 j
2 j, k( t- m( Y) l2 A    geth--datadir=./chaindata/--rpc
4 ^. Z# u: M5 `6 i3 e: T( f' m- ^( |" m
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
& l' s6 D2 @, b' s; x) U2 i4 O8 z/ G$ }' B7 [0 G
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
- z! e% l5 ]5 S6 K/ {: {% h7 q# L' M8 |9 I  \
    mist–rpchttp://127.0.0.1:8545) \% F- N" u( @- B: U' ^. w3 v

: G/ B7 ?& X( K8 i/ s$ a& a    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
/ ^* l1 q- B4 _8 @) f
& F% f2 n! t' [% q% |    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
$ {  k+ X$ |4 i! \& ?9 Q9 t
+ I+ J  Y6 u9 ?9 R$ R7 ~* g    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
6 Y# ^; t( u; m6 y0 T  ^( _) ^* g$ O; k& @& W0 E& D: N) i8 h' `5 Y( Q
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
& }! h( i9 g# J: a$ R1 z% D! J# ?9 Q) D, ?# S! r$ C7 c5 m
    打开一个新的命令行界面并运行以下命令:( E  ^0 b2 o, e* O

( v4 R9 B; D9 y    gethattach3 E1 c6 v9 Q1 f8 M$ s
; g( @, Y3 \  @0 [* ~1 p3 v
    它会运行geth的控制台,现在我们可以与它进行交互。  r+ S1 f6 n# G# [1 x2 y
# _2 j2 H* U' [& }+ C8 ^* `4 u
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
3 [% I* t# J- o5 f! _
0 d5 h: K' J' x    miner.start()5 w/ U2 H" T) M5 z/ U( N

6 P( m# t; n( n. s3 H. i6 ?    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。4 n$ ?+ b) @: C& E5 V/ b

: q, G1 ?+ A9 @! _0 p2 l    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
5 Q2 {' }9 {9 y) u- S& O
+ b% `$ P5 k" G1 z% y1 k$ F8 g    现在,再次打开“truffle-config.js”文件,像这样修改它:
6 F& \9 q. R( g. J! M+ ^
) }" _/ @0 \! y- R1 b. h) z    module.exports={9 z6 b! |' Q! W0 m
! o8 @1 E/ {$ f# f" i. ~; ]
    //See/ T$ ~# z: _, t, a

4 Z8 K- ^! U! X2 ?    //formoreaboutcustomizingyourTruffleconfiguration!
1 u9 s, ~( Y7 u' ?
- I* b" Q. g$ }    networks:{& J. D- B3 Y; E1 ^3 ]9 }8 ^! z

! f( H8 Y( P: H1 u    development:{
% O" d, W: H! o+ {9 w' |+ y; Z' v6 ^  @, u  D# }4 U- G7 t: d
    host:"127.0.0.1",# J% X/ u) p+ |$ X
- }' A5 q5 w) V' H  f$ y
    port:7545,
( }4 a9 @9 z, H; D8 Q0 _+ R5 s/ O* i& g
    network_id:"*"
8 y& ~  E* O1 T# J( c; g# g! d4 G* s. `" S
    },) D6 q. w- i" B5 B  I8 B7 {4 b

; P' _. N7 H0 r" U    ourTestNet:{
% M$ ^3 E* q$ c. P( f- M* I5 e& e+ s8 d8 A- D
    host:"127.0.0.1",
* Y* o7 r5 t1 R# g; c1 O1 F; R9 k7 @- B) u1 a: ]
    port:8545,, X  o; H2 N" z% M/ p) @/ n8 z: g0 N
) l7 N4 z) E) Z# ]7 U
    network_id:"*"; b/ R: D2 [1 J& M8 f

9 w. f) ?- k: ]7 s( ?, g: F    }
! F+ [9 L! G- X' \& w# _* m
1 `& E. [% M, S    }; O  v8 T% {+ b# B$ n# [6 {$ E. N
) D+ t; [" W: x7 X& |/ R: B
    };
/ x, _& X1 O4 c& k- Q$ _* T6 M3 d) b9 S: J. g; M( o
    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。* g, j5 n7 D& P" ]3 c$ \. v
. N3 \3 r& I0 c# b9 e' \
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
# P( i: @. s% s1 `. V$ l
$ y5 _7 z" I" N4 y    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789'). U( k; t0 x( w! ^6 U0 M
( A) i  E6 ^. B
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
. x, \3 D" `5 h8 n" M6 @# r
$ b6 \0 z6 Y# z5 W, S' w. Z& T3 I    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
0 G: B# U! c7 B0 |9 d0 L  G7 O  W0 Y1 K6 x2 n) K
    trufflemigrate--networkourTestNet
( |4 @/ ^  |5 ^3 V, o
/ V* M3 T2 r8 b/ z3 @5 {    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
0 d1 U4 l' P. f5 g3 D% x6 I' n& i. x% @
    现在,运行以下命令启动Truffle控制台:$ f% ^; w# z! X( _5 [
( i7 x7 y! s/ S: y! U
    truffleconsole--networkourTestNet" m: m, W. o9 u8 M

# K; M6 O; v- w7 G. z% J    然后运行这两个命令:0 Y% e4 G4 \! K9 F; m  t
( x  B3 B4 a# e. i
    Wrestling.address/ D3 H$ \) i' f' _& H
* [6 W% E5 t! j8 r$ d
    JSON.stringify(Wrestling.abi)& g  |. N1 R/ I8 n4 d& h: x" K
$ d8 j, A5 N' U9 E. x/ m
    你会看到这样的输出:' L7 _! U. T2 ~. a

9 N) N8 T3 l4 C" H3 v( Z# x    第一行返回已部署的Wresting合约实例的地址。
$ q% @+ z6 p0 _1 U
# P# W% B; g! b3 Q- L5 r. \5 N    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。9 _8 M4 v. D8 X% {2 M

0 v- f* h5 U  n( `    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
# W; W: ?9 [, n* I, _
) I, l2 s1 y+ ^' G2 P+ ?    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。( B- g; J* D/ ~5 _# |$ r
" e% n: Q6 `3 V3 d, O  }9 o
    然后,复制之前部署的Wrestling合约的地址和ABI:6 f2 i" y& @. W: s: c

9 I8 w& [. ^4 _3 m0 h3 E: I' [    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
8 B/ Q! X$ z1 f5 o
4 Z9 r- p3 t& \9 z5 i3 b    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。/ P  g$ k# k1 ]7 R  ~7 [* g/ o

+ w% W+ q6 H- _0 {    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。+ D8 L3 E# M* E! G6 R8 o9 l- _

$ d( c) M, j3 r! C& l1 F; X3 u    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。* G4 B" a( j/ g$ N4 `7 _& k, P
  H6 l$ {$ g: Q/ T" W, c8 b# u
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。  {+ T- c; c3 g' C2 o

  v. l; e9 B# R; B" _    本教程的资源库可以在这里找到:0 c7 S" o; x4 q4 N& p+ W, @  W
7 V# F5 D$ u) \: k" R6 t
    devzl/ethereum-walkthrough-2, ?# D8 u7 J- d7 M

( M1 i; \! \  K+ ^1 T: h3 [    总结. `, D; K1 D) @2 z/ }6 C) o9 O

6 h+ A; o0 n+ S% @    我们已经学习了4种开发和部署智能合约的方法:0 f1 J* O4 k# e9 Q/ V, s* J

$ g& B" n4 v" T5 C2 y2 i% L    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。1 I! }! J1 g. g- D* y# r

# X9 J( o4 P9 T& m    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
7 C* N! I2 J+ m" V7 e: V3 @/ W! ]& ]7 ^. e
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。# V% Y+ C/ l# ^% {& `( d" `8 z- D

7 U. ]* i7 C  [8 L  x1 P    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。7 D. e5 ^% C1 k; K
$ B3 S0 Z2 N* |# W3 U
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13