Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
% P5 n) `( N9 x1 |1 Q  {$ \( b. C" x6 G* U9 N/ O) L
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
- l( E4 \) r' A* t, y3 i: o1 W! K* W3 z1 s1 d
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
" ~' w- D' ^! x% A& o& x; J
9 {" o& Z/ Q0 Z    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。5 K' v7 j% m5 V8 l% ~6 ?
) e! \6 i9 z, E0 T1 U# v0 K
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
9 B6 T1 t0 T7 \0 k+ j7 p/ l6 q% t) D9 p4 N0 t
    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。9 u/ Y( Y: u4 Z3 C5 H

% Z$ X. L$ z% K$ r    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。$ `+ E# }  R6 \7 m3 V2 m0 Y

1 _- I# A% ^! G6 J6 B4 C& e    安装! A/ e4 u' m* j! g8 R8 d1 O
# F' W" x9 r4 i- l6 d5 Y% r/ b( s1 `
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
0 X% S0 r) h6 l* M7 e& `8 F. b" f- [$ b" Z+ m+ V
    Truffle
' P3 ]8 o) f, f1 ]6 \3 p( y2 D* U( H& v1 U- ^3 M
    打开命令行,并输入:
: [2 X7 l9 w4 }( W  U. z
% ]3 h# S6 x; Y- ?$ L" J    npminstall-gtruffle! N% O# f( B: P* I1 W& r' z1 Y
$ T& t1 ]& @* X! R. Q
    如果出现错误,建议你多阅读有关Truffle的文档。# G+ r  y9 B: I' Q/ B- X" ~6 ~* j

2 ?, H7 C' |. E+ Q8 n1 G" Y; L8 h8 b' R    Ganache
/ A- w; M0 P% \  W8 w/ \' L5 M
2 i0 A( }. t1 g3 M7 f& @    然后,安装Ganache的命令行界面:
' i; Y' f# ^& V9 ]
7 u9 W$ B( a1 j    npminstall-gganache-cli0 A4 n1 z; {* R+ v
8 D' t/ q7 ?4 X* o( L- d) g  ?
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
) L5 ~3 z( v4 p+ K' D3 G! E. V) w6 J. @7 ?; e. p. z( b
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。& C$ ~8 |2 K& g

5 T9 e2 u3 I- W3 x- A    开始吧
. S9 y* G: H% w6 D$ e  e
; d1 u/ P+ [8 B    首先,创建一个新的文件夹,并输入。" ]" d, O5 C$ Q9 ?7 I! b

( c( h4 F+ K) W. Z) J& e    truffleinit
9 u: w4 v+ Q+ M9 w" T5 g, m( _0 |6 {5 S
    它会初始化一个空的truffle项目。
+ O  g  F$ H. u; h: R  J& R2 z! Z( {" I5 b- ?! _: V$ d' [
    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。4 x+ C, r! E+ }
1 g7 F& p8 e9 c" V( L6 d
    将下面的代码粘贴到里面,然后保存。
1 ~( @* M8 B" z4 l# F1 j0 j/ ]' X0 ]3 V
    constWrestling=artifacts.require("./Wrestling.sol")
: ^/ o: k& {& N- {. ^/ c$ a0 M
8 \6 o5 K2 w& L# i) S. {8 `    module.exports=function(deployer){
+ n6 b3 h8 `8 A# y/ d/ q
! d3 t) v) g3 V% Y% E( K    deployer.deploy(Wrestling);2 U' t9 O, y. y3 `- F9 x. I3 v8 j
7 n8 v5 t- z+ s( e4 ~; Z& p9 F0 w
    };  J2 K( x4 p% M# Q8 c" L" E
$ _! N% P9 _, ^- \5 F* c4 g
    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
; o- @. o3 S6 q" G4 f4 B- ], t
! e& n' k! g3 b$ y1 M    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。
- H3 R0 M) d- x  o" V0 c9 Z
) l- ?3 {4 |/ q6 D& P* d- b1 v8 F9 |" w    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
' Z. ]# ]" S" t1 E# W7 I6 [9 o4 f8 T6 C6 }8 |+ |) F( P/ }3 K
    module.exports={/ f: [3 L! {5 Z6 t1 n9 d% u

% O: E* |9 w- B. c1 y: t    //See9 b- r) t( {  E+ a
3 j  n1 |* w' S" W. L! }6 B
    //formoreaboutcustomizingyourTruffleconfiguration!5 r; N, V, G8 ^1 }8 D; f4 S

* }; e- b0 C0 l9 T3 h8 D    networks:{- |" L; z! X" E. Q: U, ]
, c5 Q+ D( O) [6 D, W2 M& U
    development:{
3 C" r5 @4 y/ E7 ~* j! j) m
& A# N7 C  Q  {5 z( J    host:"127.0.0.1",
' d3 ~+ ^) u8 Q! f1 X
; L. `) `& S6 a' `" V    port:7545,: G' u* v7 x* D5 e4 z' A  `$ _2 F8 r
( I% i- C+ c# _! M+ d
    network_id:"*"//Matchanynetworkid
5 M2 l. _3 I% j) f' N% ~9 Y$ o8 X; J, {: q, m9 d. q
    }9 g. x0 T# o5 N$ |+ C* o% P7 ^1 Q# @
& q. T, x% u" o+ G( \$ A* Z( {
    }
9 w7 f1 l  l9 p9 Q. D( Y- W2 b& z8 l( y7 j8 h2 p  X! Y
    };% a6 ?, O6 Z, o$ M' B6 |5 C6 G) O

! d6 ^+ M. _& S  i6 a    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。# Y) Q6 p: m8 Y" X7 X
2 X; `3 x# h5 O" L
    现在我们准备在区块链上测试代码啦!& ?7 F+ z+ e( c5 J' v' K& }4 Z' `
* s. y  q6 ^- P7 c
    测试我们的代码% G3 {7 p, }# Q' E1 _, D  j

6 i$ y- G" b% T  d% Q. L7 {+ E, L    在第一部分,我们会使用Ganache。
+ |& h" g6 q6 C' P
5 V" a# N* J5 j    启动一个新的命令行,并输入以下命令:
- E+ K: s- G+ F' u& H- x+ y: a3 a, c2 A6 V* A
    ganache-cli-p7545
6 o2 s- u: ^. S, U$ L( U* z# D7 u7 p4 o& k* r9 g$ V, ~$ f
    它所做的,就是告诉ganache-cli从端口7545启动。
" M' H0 u  [6 s) r) y' \! S
, f! H* j. w- @    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
# z* s( C- J2 j
9 U6 k/ g7 g, n& c    现在,回到我们的第一个命令行界面,执行两个命令:
. H- ^- ~/ O* h: }% W; C
5 I. F2 a- u6 l3 S  k1 h    trufflecompile
/ o, q/ u" \' T4 m7 q; K/ @, n  D/ [8 P& h, a% q" R# W
    trufflemigrate--networkdevelopment2 H5 Z) O. e+ {$ g8 s, _

" F0 S: H% z3 }" w6 \5 a, t" N/ v    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
+ g8 k* Z" O1 N8 G
. H7 v8 a; U- J% d5 d    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。- }* \6 \2 M6 l/ R

' _+ i% z' V2 Y0 y    现在,如果一切都按照预期进行,你应该会在终端上看到:/ o) D  a1 d5 ?5 [/ D' M' Y/ D
* G' K' }2 f( K3 q' |
    注意,这里显示了实例化的Wrestling合约的地址。
, y( [# |- ]+ k7 j% `( G& e) H: [; {0 i4 Q
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:; L- D. [' v: `$ M; k

8 G1 }2 u7 W+ i# ]1 A& n    注意,它显示了实例化的Wrestling合约的地址。
, V% E# h& b9 _8 A% K* _% |6 G8 P4 G- P6 \  H
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
1 Q: _% W$ s; N& R: E4 {; X7 i+ K$ v
    truffleconsole--networkdevelopment5 E$ j, P( k# H8 j

' ^) }- J# o3 S4 s% N. U    首先,我们会执行这个命令:
+ F6 ?* b* h3 ~0 h+ c3 k" g% y0 V5 w* ?  Q
    account0=web3.eth.accounts[0]
+ Q- H* J+ o, [+ [# F- p2 U2 w: H! C% P, ?2 Y
    account1=web3.eth.accounts[1]
& P* ^. y, x$ `! t; w5 |0 l$ Z* ]( M9 H
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。( g/ ?% [$ U& c8 W

( G' v  D8 V" F" |4 O    然后我们输入:
' x& E) F( E7 U7 q3 M5 q
$ g+ N" Z. B  K! \! _, \5 x) x1 c    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})
0 B8 c8 _2 C% r. i. D. v1 ^# ^7 y8 e( d) m! i
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。' V- h* |+ H9 I! V+ D# ~. W
3 j- i9 R2 D1 u, f. Y4 ]0 B+ z# ~: n
    执行下一行:
2 f2 c( }: V+ @2 [! d4 t' a6 i; A% f1 F# H4 Z$ A
    WrestlingInstance.wrestler1.call()+ L7 Z) o* Y" C) c/ \
  r, |, o3 X6 e
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。% h9 D0 r( g7 L9 b- ]! x

; p( ^' t' I* Z+ F- `  m1 r* {* m7 x    然后我们把第二个账户注册为一个对手:: C) c8 N# O& @
. m; Q$ j/ M; a( e/ d
    WrestlingInstance.registerAsAnOpponent({from:account1}). d0 e) q: u9 N* ^9 \
/ x! N+ {, \2 g. [- e' V
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。' q! g' E( U& e4 M

/ {$ I- O! x4 `- l    在执行这一行之后,它应该会返回类似的内容:/ s% F# e' m0 b/ s% R  U3 g/ y

- k( u  n" L9 x) k% X7 `$ l0 F    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。
/ a6 Q& p! }$ M9 g3 z
4 E% _. c7 f$ N! Q) r! y    你可以通过执行下列代码来检索第二位参与者的地址:- ~0 l1 u2 z" i. ^; e

& U' h+ q8 E7 g7 _    WrestlingInstance.wrestler2.call(); M6 u5 c3 G' E- \" t  Z

! d" L7 A' \# o0 v5 f    现在,玩家们可以开始角力了:1 K4 }5 @: }$ m) s$ E
! W8 [/ s: @% n$ N  S( _. B- |
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})$ w$ k* f. r8 t6 j# d7 s
+ \3 O5 G- C) F. j/ \8 c$ M/ a
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
) r9 F! V# n) T! M; a3 o
0 K5 I0 H8 P2 s8 Q* i    //Endofthefirstround
, _2 |+ g9 k* C% t+ q
0 t1 |6 O/ [6 w9 h) `    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
. C+ W: w! l+ U1 l) ]) l( J3 e! }# ^& l8 `( R6 M
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})3 l$ v. U8 J6 i/ f( p
% G( a5 ]; O( P0 x7 k
    //Endofthewrestling( w$ L2 B& ?- K: Y* ]: @. a/ s
1 H! S1 ^/ `' ~( X  ^/ y8 u
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。# b+ k0 x# u2 y$ U) J7 w2 B( b
. i# B2 u* ^! x/ C
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。; I( [9 I2 R5 r; I- L( q" B3 b

" I0 e1 W2 Y, e3 G; R% w3 p: ?4 g    给你留个小练习:从合约中提取以太币。
2 ?* Y4 ^: L6 i% B
# E1 w5 ?. j; X4 z& O/ T! F1 T    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。9 B9 A- d& o9 z) K. [- b* }
" _" M" x1 \' U: z
    geth如何在这个过程中发挥作用" p" I) [# P! `& ]* H- J1 Z
5 m6 t9 X6 Q! s( e- R5 f, Z
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
* I1 z0 z4 Z% c9 H. K' l( k8 b  o! r  z. B  e! R4 O; q# A) K$ L
    安装
& q) @% x7 _1 ~  [- \# o( z* J- ]" a- t: h3 L$ D
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。
% p# o9 Z3 J, H' |  @( o  @4 [7 G6 `. j2 r" G% I
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。( y. Z* O& u2 [4 f( H. m- r, f

3 L; J$ ?# i. }& s  N    创建本地私有测试网络
& u" U; F% p. p$ L; R5 Y. Y& D$ o% q! y
    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。) j/ H: H0 y: b8 M

, M3 [: U, p. p# o+ K6 k, D    {; S, |% ^' w7 |3 A: U/ N
5 T8 C3 G# s0 v+ D1 N
    "difficulty":"0x20000",/ s2 e  w2 l2 y' |

- ?0 W8 I' _. h: T    "extraData":"",8 e* d4 S, q/ O: c7 C

5 N$ V: K7 ^) Z7 y    "gasLimit":"0x8000000",6 d$ ?7 w' D9 [$ H, S
4 [" v/ z; E) a! e2 p5 y1 E6 O
    "alloc":{},
& g' A4 x, |6 q( {0 e1 U7 |+ ?" i  a5 T  Y
    "config":{1 E, W/ P) e) s, V4 j
" t' B# M4 Q& Q( b, r5 j  l5 q( A; \
    "chainId":15,' c% m' K4 U& f& ~* C* @; |
* S# x0 v( r# |3 H! [! w
    "homesteadBlock":0,
+ m" F+ t' x# v5 D- g9 z! t" I" R8 [9 f$ @/ \/ O
    "eip155Block":0,1 S% x, Y) j' @" W0 c

" D8 o7 h8 ?2 J' M1 j    "eip158Block":0
4 D( ?  R+ ?# I: \0 ?; W9 y
/ L# d$ j3 m0 ~8 @% Y. v    }3 O0 U; K) N( y( _$ l4 ^

9 j8 K7 K$ n+ w* J. R- F% \1 N& w- k% X2 r    }, W; Z; j8 a  y0 F  S! K2 L
7 O9 _  r7 ^* q. y; K# K0 k& Q) U
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
: X! ~" I; l8 ^8 @4 T9 }# c* C% p. J6 I" Y$ Y6 D" _
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。3 M& e! ?" r" C% d; q/ A
. p: w' ?' x6 d, O% o. n( k
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。$ k% K, v8 u' B

: v# ?' Y' c& i$ E    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
6 F( h9 H' |( \% N9 r
# d- I! M( @! i# U7 j    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
$ D3 x! t3 t% ?3 Y1 x' M& S$ k' }. n" x
    geth--datadir=./chaindata/init./genesis.json
1 @& O" o. r0 C3 n
- A+ @( U1 G4 I- E    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。4 }) U: t+ t+ p5 }( o

% ~0 Q4 b- z2 T    接下来,我们使用以下命令启动geth:
+ `4 f8 A! I/ \4 D3 i  {& A  M
" n$ h- N& S0 ]  f$ y    geth--datadir=./chaindata/--rpc2 y0 z$ O- J) O! B
. Q5 R! x  j% |, a% T- L+ G5 |
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。$ n) e* E( k) n, s+ ^- I+ P& O

- c  s) o' o& e    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:0 G0 `' A0 W# F) S6 w2 [
& N/ }+ V4 T7 g% T1 Q
    mist–rpchttp://127.0.0.1:8545
0 O5 k' `) d. @, x2 [3 d+ `* Z9 E  B
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。+ ]9 S1 r, O! S( r3 M, J. @" z
9 J+ \  _, U( C  E3 j1 Z
    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:- u% @+ t+ s! @( I( k4 u+ L

: f* t& U2 t; ?: W% o    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
* K/ L* z" V) ~/ r+ C  ~1 j6 _
2 r/ R% e" R/ @5 T2 p    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
" X' f7 F+ D0 ^1 `
; w# B6 m: h1 J$ _    打开一个新的命令行界面并运行以下命令:, H+ C: |- s% u+ i4 e1 a  F. V

" T+ R  n" q+ c$ l    gethattach
7 E! \# T5 a; B, L& M, D. l- s" ^2 C
    它会运行geth的控制台,现在我们可以与它进行交互。
6 n& v: ?* t2 j( b: A# y
6 Q! U* X' z  H6 E  {# g7 p    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
3 f  @1 d2 I3 X% @
7 z2 \4 ^- |" |, ~5 y, Q! ]0 z    miner.start()
0 K; z% O/ K# L6 v# A& T  e$ S, h/ p3 L$ e+ O
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。
' m& s2 r0 j, R2 B" ^
; s. i* s8 P. Z; k8 }    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
# n1 s- k; F& T2 ~8 l, W8 h/ C! i( {
    现在,再次打开“truffle-config.js”文件,像这样修改它:
+ Z) s) t+ k& m
& D. d0 Y2 |/ F7 P: h- a    module.exports={9 N0 P6 c' ^" b$ d/ _% w* w
( c5 [3 ^/ Y$ G8 j5 Q
    //See0 m0 n% g& Z6 W/ O. t8 S3 ~5 Z0 @8 @

5 `3 M( P: j+ [2 [1 f; e    //formoreaboutcustomizingyourTruffleconfiguration!( p6 H( l' e  d2 L, H2 Z$ ^

2 Q3 g  t; f) Y! u) C1 ~    networks:{
; C6 @/ H; _3 H' n# I% G% x' ?- ]4 P
    development:{
1 h" M- H/ c* c5 M1 o3 M
' ]8 O( u- v  `3 {  _. y8 Z+ k    host:"127.0.0.1",7 M5 ?" g* q* Z' f; f
6 q8 a- G: C2 d$ E. j2 d6 V! Y
    port:7545,' a! O* T% w* m2 X. K" ]+ U

$ k* p$ z$ f# g" I+ F2 Q    network_id:"*". R0 D) U4 P8 w3 L' {" P
9 c- z0 o: o9 Q2 b$ F% J
    },
5 A( B4 V7 D0 T% U7 }6 q$ F; e- V! M  L
    ourTestNet:{
, g+ a4 w/ y$ {5 L7 X( Z& i8 l+ O0 Y. L: |' B7 s% F
    host:"127.0.0.1",/ f! `1 U6 [: `0 s/ d

' v5 O: i6 A% b3 g; i5 g    port:8545,+ |3 u$ G0 J' `

( U8 ]- Y. ~! Y6 H6 e* V2 l$ ?, b9 a    network_id:"*", T8 I4 W+ M; D. P/ S% z
6 }- \3 y& m+ F" |
    }0 y8 u( c- @9 ~! u; j. u6 f+ n! K
2 _2 s8 A9 i0 l3 z
    }$ t( X3 V8 F! b: Q
. V8 n- Q6 w0 r6 g+ s; W7 M0 Z
    };3 |2 q7 }! d- u$ z/ ]6 R0 ^
. e1 x: i- ^% P% y# y
    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。0 c% k( O7 I/ l& R

$ i: Q; B* {. k( X0 s, ^    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
7 L3 T$ @: @( W) h8 ?  K7 k
) X, N, L& U9 ~- X6 W; w    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')' F$ j6 e6 f2 e) M4 v* k4 @
. Z% |  |( {. t0 ?- t
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。* x7 D! L  R4 f# ~# m. ~6 g
2 ]2 t* |3 Y& Y1 ?
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:; N& Q" E, C0 Q: E
8 F3 ?9 a, W. E. Y5 u3 G
    trufflemigrate--networkourTestNet8 I& |4 R' B8 ~: L* c6 k: k
* j8 F) y8 A, ~( O
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:4 Z" O7 Z& N: |4 w( I
4 L" w& q" E! o2 U' [% D. ]
    现在,运行以下命令启动Truffle控制台:
" v0 P, p2 Q1 g) p3 ]) Y3 ~8 s8 t  I. C0 l2 }9 T
    truffleconsole--networkourTestNet
7 g! ~0 K: o- i1 l
. Z' O2 G& Q& m    然后运行这两个命令:
. R' z: \# g7 u/ U, o7 z6 L( ?  _# E8 O2 \
    Wrestling.address+ F3 m' m3 R1 f7 F* N& o

3 E7 g% l# p9 x- T4 r    JSON.stringify(Wrestling.abi): @" ?# @' g6 i0 T1 C

! \8 X* k9 ?, M5 b  g4 O  S, e    你会看到这样的输出:7 v5 q6 B6 i* H/ X" W/ }

. \" u3 W+ l! W, |% s    第一行返回已部署的Wresting合约实例的地址。$ z' N! |  E0 g$ e% y* @$ L( Z* I
) l1 s* L& z- A, u  E- V& X' t! y
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
7 ]3 \" m9 J5 y/ P; {, Y* J- y' z; k9 T0 u8 G& z6 c  }
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
) r: T& f' F1 U: I2 Z3 |$ w" D9 d; n& f  M7 {" @: u
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
/ R/ I& n( p7 O1 H9 K, H
& ~$ M8 ~7 J* _  ^. M: P3 A    然后,复制之前部署的Wrestling合约的地址和ABI:
$ u4 T  E# n% m6 L) a8 l# ~7 r9 E+ H' M1 ]  _2 ]% F
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:9 _# y+ r# o& u; V' S. }0 {
0 t/ A0 X; ]! \5 {' m
    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。7 e8 \8 X& v1 N

7 p  x0 ?' m+ u7 v0 f    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。
( n* G, M1 X. j% y/ J) J2 r0 i0 o+ O6 t7 B& v4 v7 Q
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
% L2 u0 r  V& _* ^% C! Z) r$ p) R) m& N/ q% x
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
+ R7 V7 D: h( Z8 @- }. S
" U* H8 U" N* z) l5 T    本教程的资源库可以在这里找到:
4 c8 l: @" r1 u1 F4 Y. ]2 H5 \  r8 o# e1 X% ~  b3 b; \' S
    devzl/ethereum-walkthrough-2
" Z3 {  h/ @) k" _! L' u9 k4 d( C, a" k+ b3 P" u
    总结- P, ^6 s! z, W4 r4 o/ _

6 x8 }) Y$ x' ^4 f* t    我们已经学习了4种开发和部署智能合约的方法:
/ N5 E3 `4 ?6 j" r* m. G' r8 r( u% a9 g4 ^+ y5 T
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
$ f& q& c8 }4 M5 p+ G6 G6 D' {+ `! y8 ?; h+ T
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
( Y' W  W7 C: \0 C8 e. i
$ o1 u6 ]5 n% K0 V    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。) F8 b, m6 p1 [  D4 x5 ^
$ c( t- u$ q. h- X' ]9 s- B1 m
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。- z! v8 [7 x7 T- r. j
( Q' A; o, F# s9 E. |! k
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13