Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:  R! L! Q: {0 w0 k0 Y

1 g4 i2 @. z* O! ?& P4 w' {2 B; O    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
3 \. g" n: z0 l: Y
4 @" q( P$ v5 l1 X    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。- Y9 |  H7 E# C& \2 I) b$ y7 e
: W/ d1 ^7 q" ^7 _' d9 o8 t3 ]. e
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。/ L! b- |& j  B- f/ J/ `
- u9 t. X: C: t4 V5 ^8 K
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。7 ^% ]8 u9 G6 e0 l+ |

4 g5 F9 `4 D. ?$ a; n    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。2 b* y  R. o$ [) @; }. i& w

1 b2 p1 j- r! J    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。! K  C% C; ?) Y

% B6 ^0 M1 ^/ ^# B    安装, [- J' v% C) _2 K

/ }/ u$ L: {' B, {2 U    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。3 ?* c2 Z  [+ D& ]. F, E# G1 _8 F) j

2 e9 w; o) v2 |8 {6 c& n    Truffle
) Q( H  F( N5 Y& x5 V0 `" i* b  x- S; b
    打开命令行,并输入:7 }  F7 c* O9 M. Q/ g- w. v1 U$ o
& {( D+ X* t' w5 {+ ^. w! Y. @
    npminstall-gtruffle
4 b$ G. Z6 O" q! M4 R( l! W3 D; W& ], t! g
    如果出现错误,建议你多阅读有关Truffle的文档。$ t7 ?# o1 ]8 O* A( B# R
  z! N5 U0 Z: Q% h& \6 a9 a
    Ganache
7 L4 P% u4 g. Y1 ~4 h
* U6 O7 U* R1 [1 F0 e) I+ W    然后,安装Ganache的命令行界面:& L/ B  ^7 o4 J- w" c/ W8 j

# ]# K. ^* E3 n- ]' i    npminstall-gganache-cli4 D. w* z  d, f$ S0 B

& }$ c& n/ f+ q; w  E' {    如果你对此不是很确定,点击此处访问Ganache的Github页面。+ F5 ]) ^3 }) E% F
/ V' n, m: [) K4 R
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。: f6 `, w( X* r# U' [9 W

/ m$ d! S3 |" w3 S6 y- @' r2 `& E    开始吧
# U3 o+ y$ |8 }4 o7 H6 n" H" @! _- s. ~
    首先,创建一个新的文件夹,并输入。! }, o2 M% @9 J
0 g# T* n, x# ]. u2 N/ n8 _
    truffleinit4 J# L: h* W/ ]

! `. ~7 `( ?$ B/ R    它会初始化一个空的truffle项目。( B4 m  T7 |- d: \: b1 t8 X- M
' f; d2 [1 l3 G$ A8 O* r
    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。) ?# x" f" d  j2 B" n. B8 Y
7 E, Z7 t; B: }, R" n4 |8 U  {
    将下面的代码粘贴到里面,然后保存。$ Q! Q* l  R; O: Q- V
$ t( ?* E8 H8 M! P4 k/ t( g- b: Q
    constWrestling=artifacts.require("./Wrestling.sol")
- w7 u6 q+ i% w. Y7 E9 f! \  Y
# E8 n5 A, C( Q# P6 r7 Y9 I) z    module.exports=function(deployer){3 |3 V7 A3 S0 n

; `7 x9 n( W0 G4 ]6 w- j' k    deployer.deploy(Wrestling);. e8 ?2 N! ~2 l& |! w

9 x! \8 x1 I9 G& \    };
) t. \& l  E. }* `
6 Y+ }9 H! n+ l    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。3 D# a$ L% P, p& `, `% c
8 m' w8 ^2 d0 c. n3 D2 d3 y7 t
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。5 b2 n% }; }9 U* J1 m& E, \! f/ h
  t- ?* @" Z7 o, r" Y
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:* t) f4 r) U# h3 m
+ {# i7 j! j' ]6 ?1 Q
    module.exports={
4 b8 H1 _  u0 c% U2 s) c6 L' o% y1 y$ p4 B3 @9 G
    //See  v6 H, V9 i5 F7 d

7 V7 @$ i" k; s    //formoreaboutcustomizingyourTruffleconfiguration!* I( `; |  I4 `9 u3 K. g
" W/ w$ x3 ^- f0 I' z& x
    networks:{% t& a+ U1 v$ y4 w: }" w9 L

7 x3 z4 `- P& r' q    development:{
4 p, {( ]. V. P9 t, u. y4 J0 J9 [( j
; z7 e' u3 y" M! t0 Z2 j  l    host:"127.0.0.1"," O3 u$ A" D9 K0 S8 Y
+ Q$ f9 i( ^# X0 ?* e
    port:7545,
: g% g, Z3 K3 t# w
  G6 z: l0 n; S, p    network_id:"*"//Matchanynetworkid* {* n' a( H- r: ?9 ?) |+ j

) |! b4 Z) S. Q( L& b    }6 d1 p# ?( u9 h. R" |0 ~
6 ~  r0 s! j0 B  c2 n) g
    }5 ~8 z7 s6 g) L$ z

' ?: k$ Z& L2 e* ?9 @    };/ v$ y. z. J) N' @

$ `3 n* q8 I. M2 v    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
% @1 J+ W4 [( I! h8 G* p
0 j. h/ J4 v* B9 R6 z    现在我们准备在区块链上测试代码啦!0 R3 H% u4 o3 Z' u

1 L- B* s( d  o6 k( Z    测试我们的代码3 M, @  ^5 _$ v" h& C

' _0 y0 h- F) E6 ~- B    在第一部分,我们会使用Ganache。
. ^% T0 L/ l6 p9 I1 [3 F
$ S$ v$ }& e* z3 U8 \* n5 z) }    启动一个新的命令行,并输入以下命令:
4 D- ]. P  e1 r
0 q8 @3 d$ \+ [    ganache-cli-p75458 s$ w% T9 t- L$ V
" i! {& p$ ^/ t7 u
    它所做的,就是告诉ganache-cli从端口7545启动。( _9 u1 _" Q3 b7 d% s: p2 s

6 K  p- t5 R( I    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:: H: `! H' \/ u2 U* m0 z, }0 f) Y5 @

3 N0 U# [! B! ^    现在,回到我们的第一个命令行界面,执行两个命令:. j, y/ X1 M& @

8 W2 _# G# |  J( @  G) z- C    trufflecompile
; `! Y' {* l% n5 d2 w/ t( Y; @) a4 O# T$ g  h
    trufflemigrate--networkdevelopment
7 N! [& a) b4 J$ L* G# @; p
5 Z, j1 a0 }3 O( {4 @' }    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
7 A! {- s+ [0 ]/ M! Z
# h" u% o" o' W$ r7 P) C/ G; n    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。, X( Y1 B7 A( l+ E4 _

" T) u" Q2 `  E    现在,如果一切都按照预期进行,你应该会在终端上看到:# o/ o' E0 R$ @# n5 i  @
) x" e# X5 I- o4 F
    注意,这里显示了实例化的Wrestling合约的地址。9 J/ D4 D% B, B2 K8 t/ E4 z* z; g
7 M3 H: d$ a7 n! W9 M) I
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:4 v( m$ d7 ]( l# J8 `
" q! U, _2 [! e5 U1 S  ~  l' z1 c
    注意,它显示了实例化的Wrestling合约的地址。
7 u6 }' b+ u4 L4 n8 ?8 i2 S
# _' \1 b- D- r3 y2 s" e    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。9 s6 o5 L/ [% ?3 {" v) Y

2 A5 R7 G& _+ o1 K    truffleconsole--networkdevelopment
1 l# N9 ~4 ?7 p7 z
# a; S: H0 T& C" w, k    首先,我们会执行这个命令:
; E" p3 T% r: d! K2 k  n, A( q  U
, c, i+ @$ K  P4 A5 y    account0=web3.eth.accounts[0]
! n- }6 i) B, A) R& |0 f1 W+ W- `0 p& o$ C8 w/ H. Y
    account1=web3.eth.accounts[1]
5 ^* E* g: Y; Y" \! d- E0 b1 J" J# h9 [% G) S$ @  I2 ^) H; }+ v
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
3 n8 M: `* S- I! K5 e8 Z! y+ @4 N4 f' V
    然后我们输入:& X( ?+ I8 c8 X* J* q% x% R
$ G  L/ B% z$ m& x8 {) x
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})% E- u& P2 s# x1 e. G& R

% z: Y9 Y- N9 c* ^% c! P    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
* u6 P! x3 Q4 x& N: K3 P5 H8 P- O
3 N2 K! {7 _% t$ w9 E* Q$ O$ Q    执行下一行:
1 o+ ?4 z% e7 W; s4 {0 `- G
4 Z7 u9 l2 P9 y: {2 n# c( p    WrestlingInstance.wrestler1.call()6 x- U% F; y5 d  K0 F) f
) C  c8 L0 t- l8 t0 ]5 L7 X
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
  ]4 b8 V; A$ |' c% x, ~
$ p) `5 T0 n6 C1 ~' ]0 S$ @8 x    然后我们把第二个账户注册为一个对手:7 r0 O( i  }$ l6 @, S2 p! r

; s7 w7 |, d" {$ i% G    WrestlingInstance.registerAsAnOpponent({from:account1})/ a/ K; [) v% n. q

* u, W# b- b; X    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。  T- ?+ v5 F# F  S# F& U

$ Z! |. Y, e& S9 K: X    在执行这一行之后,它应该会返回类似的内容:
! C$ X- G% E! q+ I; n/ w6 K0 ^1 |7 M" K5 H: N1 l
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。# p: E' s0 w% H( g
; }/ G) C2 F! ]) w6 a6 E/ ~! G2 o
    你可以通过执行下列代码来检索第二位参与者的地址:
8 F7 v; t# ^" y
# ^; P0 o) v9 D- h8 a    WrestlingInstance.wrestler2.call()3 H! \/ S2 `* v( X- n
5 V% N0 z6 O4 J" F+ N( x
    现在,玩家们可以开始角力了:* M- H) t! p3 j: K. m! r6 n- H

# [/ p  ]3 J7 y# O% {- v    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
3 S$ f5 t* M1 t0 |5 X4 z* k1 N& c4 d8 A
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
, D: G3 |# ^' {+ v3 |6 x; C  u2 R; j* h* }6 |  [
    //Endofthefirstround
/ j/ ~9 J( p' w* C. B; S9 A6 k! y* e% y1 A6 J. [
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
# x: Y' K- @: z# k( E# [/ y  R' i, w8 J/ A
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})8 J/ O* n* z- Y, z$ B' ~. G

0 U- b% T7 O9 }- k& ~( M    //Endofthewrestling
8 L1 B7 a9 c: n! }: d* A
" f9 {+ E5 e  l+ Y$ X% m    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
( I/ C3 i3 ~1 ^' Q
' T; t5 Y4 o$ ~0 S5 R    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。5 b1 H& B. ^# Q  g

* Q: K4 W5 s" P2 O. |9 W+ a    给你留个小练习:从合约中提取以太币。
9 g1 w# l* i; i3 O* G# f7 L- M' W
+ _. S& {) N! K5 l6 K    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。# d$ }1 o4 l9 a# r- r

& u7 e6 E# ]% i    geth如何在这个过程中发挥作用* P% L/ @; f; [: q

! C2 r/ M1 R+ T# }" D    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。& e; v8 L4 [4 C" V" K

$ j$ w' h; |8 ^4 V" t+ E$ R# E8 u    安装
) V/ E! ]( |, ?! L; H
) x5 G& H. F7 H- o: l2 t/ x    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。" T8 K/ @9 L8 g% }" l# L8 M# \
+ ?) S2 H! i+ x- {+ ^
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。& O+ N# e: B* b0 u1 Y6 S' H; t( L, r
: ]( x4 @4 r" F) J  L
    创建本地私有测试网络1 J! i. m/ b4 _3 d2 B0 @3 S

" O3 T, u  Z# m& d, g    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
9 x% t% Z/ x  v3 ^1 g9 u  M0 R( |8 h7 g7 F
    {' V  _7 L0 @: u8 H$ c8 p

7 }# Q8 {" C1 P! s3 d1 B" ]: I- [  [    "difficulty":"0x20000",! ~6 B0 p0 @, o: @5 j- r

% p  Y4 m. M9 d% s9 A    "extraData":"",* f3 C# \/ {; t

: y5 H: o# Q5 G; t2 t- P    "gasLimit":"0x8000000",' r, s* J; A4 J! v, _
, G& a5 B* L3 N1 `0 F6 Z* _
    "alloc":{},
* |8 r* q4 H4 ~1 s1 ^  P
% W4 K: g" P7 ~6 ~% Z: k. h: R2 C    "config":{7 J6 M8 f% B! j& L! b* ?. y
3 \5 e& P: _* C3 P% }8 A
    "chainId":15,
+ H1 F3 {- }8 o/ f4 l& _/ ]+ N, n. `9 D& [  O# e* ^" J, W
    "homesteadBlock":0,* a3 Y& ?3 G8 F" C. s& b- F; z
3 u1 }* L% Y% O2 O3 D; i
    "eip155Block":0,
( o$ F  Z6 m8 O4 R: k' f5 O: x
    "eip158Block":0, h& D/ w$ ?3 ?: s$ C
" [- e  j' C/ M+ n
    }* l5 _6 \9 J) a! n9 ^8 g4 z

8 k+ K" p& T6 v. z, m    }, I; H+ G/ `, X' m' n  U: ?

" J: a! u6 r' G% G1 C    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
8 o3 t2 Y0 P/ O; W" U' l  n
, d% B* V9 l8 |5 p5 b8 t3 \' ?7 z    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。
6 V3 {  _$ a7 Y  ^- Z: _* ?) |- V* q, _: G2 u
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。% _. x) v3 ?$ a( Y6 G! B" Y( W

7 c6 t  R9 R' C# H- A3 H3 ~; t" g    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
7 a# Y3 J+ U: d# J- f6 i8 W% A5 S5 y3 D
    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):2 X) P% G# K: O$ P2 j
/ N* o% A' }8 V$ V! x
    geth--datadir=./chaindata/init./genesis.json
  b3 r8 q: O# M1 N; m1 h( T" P
3 c$ F( ~: e# d. X    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
* u/ c; J1 e& ?" V! K7 m7 }$ {) h, U$ t9 F* e( _
    接下来,我们使用以下命令启动geth:: m9 {4 k1 E5 c& Z
5 j9 C; E$ E% {
    geth--datadir=./chaindata/--rpc" D) l$ M% ?5 B" H/ Y# @' V9 a) n

2 e8 A6 n8 {# N" O4 b5 X' I    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
4 i# b; k& v6 R1 [# }$ ?5 F+ p& K& }" V! n+ D& X" A$ \9 z3 m
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:4 ?8 _7 J7 C  g( _  V% d0 ^; h
) L7 U6 M# l6 c. H# }! z
    mist–rpchttp://127.0.0.1:8545
" M$ M( t! E( g5 C: {7 T
: j$ I* y, p% Z" r    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。# U; y; k0 R. F7 v

- U9 Q$ c* U& a7 x" g    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:$ J. n' j) t5 }9 J

1 q3 b+ t# J9 Y0 ^    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
4 N4 k7 c: x, G, {/ ]0 z5 D/ J# U
, c1 M8 D) V! X* s9 N9 v0 y# x    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
, u) l* J5 O# p6 Y
5 n5 I' E) u/ B    打开一个新的命令行界面并运行以下命令:# {, w  ?1 p3 S+ I+ a# u+ h/ O; p

4 Z  }  \. ]; V! _    gethattach2 d* \! B* s( E) u2 k7 L  D' k
  H8 s& g8 t% k- l  u9 F
    它会运行geth的控制台,现在我们可以与它进行交互。+ x, j: j# J) [2 C6 A# i
$ }. w% K% b5 f8 P/ G/ q' A1 ?
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:! O" j6 ~9 I% W
5 }# p8 ~5 z3 Y5 m
    miner.start()1 _' R0 i2 p& u) v
* ~  @8 \' i- _/ v% E% E
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。' s# a/ _* _  b  ~+ S) J8 }+ c9 U& r

0 r! ^7 P  n  j) e    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。/ g+ o* U0 \5 A0 }
3 y, I+ v  k- v4 V% S' F5 W( B6 t
    现在,再次打开“truffle-config.js”文件,像这样修改它:  z) o, ~- h9 f# G- r1 k7 B; ]

6 Z# D, T: {) o2 ]" H1 _    module.exports={$ ]$ ]/ B% P+ A! J0 {4 r0 V
( W; R$ H3 V2 R% P/ v# z7 A4 o3 O
    //See$ ~9 c5 x3 R1 A3 r; r: G
# a( h! a7 O3 b
    //formoreaboutcustomizingyourTruffleconfiguration!" G4 d/ H3 t& m6 ]8 ~5 ^

" Q5 @) ?  M8 s    networks:{
% j2 _) X8 g6 F0 i' G+ q, p- b/ S, |( O! I: O8 p5 Y4 j# I+ z
    development:{
, |& i4 e3 v9 H6 \& j
" y  i: ]9 K6 u    host:"127.0.0.1",
9 m7 |: v2 m! N  F- y6 @
7 C+ g6 {4 `* j. J, w* Z' s* h0 H    port:7545,' [6 x# }' p! O, x0 c! Q

8 b7 S; T0 G/ J! B4 e6 t- G    network_id:"*"! X4 @& h8 J5 m+ R. x. l9 ?, n

! o) U0 z, g( W- d- C$ D    },
9 I6 s0 V0 A- X' u
7 T( \1 Z  V) u% c; r" o6 B. E) T/ u    ourTestNet:{# \( P3 u6 V/ `5 f
8 V: R5 u7 ^' w1 S1 z
    host:"127.0.0.1",9 Q% ]6 J. ?7 f' m
  d$ O# ]: Z" j* ~2 S- I/ Y! i
    port:8545,/ U- ?$ f7 M6 b/ Y8 N3 ]8 D
9 {. y& Y2 ]( Q( E$ U& b; M
    network_id:"*"
0 `3 c7 {/ i; M2 X7 S- j  T4 D  n3 u) N) Y6 y5 [% f
    }/ Y4 Y7 E, }7 S2 K) i  q
3 b# Q* s( \5 ?) E
    }1 W0 ?6 q# A9 @: M! `

6 C/ ~( U: p2 |. m    };# l* L- `* ^1 P: B% G+ b- S0 q& w. \
  z4 a7 T5 L1 \6 q* j. _
    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。
5 I4 J4 [. L  k
) L7 C- h3 e# L3 C& C    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
. {; s( x1 C. b$ S7 p+ T+ Z: I3 h! V1 s0 s  d
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
+ L: b8 h2 ~! ^+ o; T0 P% ?( f
& h8 e, `: i) G" O3 [8 J" d& }2 _    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
  J6 B' \0 p4 i, V2 G% ^7 X
- \7 A6 b# f) A/ d$ _# E$ J) t    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:8 v( m0 Z) u  j; x+ i  {, Y

! U/ M' w5 `: k3 b    trufflemigrate--networkourTestNet
8 ~3 y; w& [9 i, [: m
7 h& O/ P0 @! [# a* D. Z    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
. w- K" D$ q5 J6 r. e
% p  i+ ]0 |% p$ q2 W: R    现在,运行以下命令启动Truffle控制台:" M) q1 A8 h4 u; Y2 T
( A4 Y' V: [9 e* i* I$ p- p
    truffleconsole--networkourTestNet
' ~/ C1 u" M6 Z  j- G' N7 U. _
7 X' n$ z( z7 M" {* w1 p+ I    然后运行这两个命令:
: n" L% |* @% Z( A/ C6 f5 u$ L. z" J% b
    Wrestling.address; ^$ l5 ~, u7 W! P0 z

4 B3 N) H6 D& A+ M    JSON.stringify(Wrestling.abi)7 H$ y( I7 W& j  ]. o2 T+ `9 S- O
' X. g- A; z% M2 x, O3 M3 m
    你会看到这样的输出:
. K; I9 o% D7 B' @0 g/ t# x7 K: L( W' N- H6 ~
    第一行返回已部署的Wresting合约实例的地址。' s' L9 a  H% F& c& w$ }
- C1 s! f. H' r7 t, X4 R4 e
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。% K+ D! N# z0 {6 E
6 R; D1 f; S; ], W
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
/ I" p/ }! g. v5 J7 e' u0 k* C5 K% D# t' ~% X  X: G
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
8 y/ G$ g/ @% n  b% O6 S
1 q8 L8 O2 ~8 U$ h1 w/ x    然后,复制之前部署的Wrestling合约的地址和ABI:% u& C9 ?) k* m8 n

  R1 x7 J! ]" K' X" Q( [5 c    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
6 Y' q: Z# A8 a) r$ U. j" h1 z
+ I8 Z/ l( V/ [" m    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。* C8 U9 w$ F$ k8 j

% V% z$ X; \; E6 U5 _# y    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。9 n+ [2 c# K# w4 @+ ~
- m# W! v1 T$ M
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。
; Q9 T  I7 H8 {8 d+ E' n$ m! M& F: Q& d# o- h$ F
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
7 Y6 ~+ C1 ?% w8 @7 @; P! G# A* [- c8 K$ u5 w
    本教程的资源库可以在这里找到:+ Z1 k" Y1 C# y" t

/ P+ Q+ Z) U. }# e5 D    devzl/ethereum-walkthrough-2
4 s0 W) z3 C" G) j' e" i' m
0 V9 Z2 p7 U1 J0 p    总结
0 M& L5 `5 J! f4 ^( c6 L
4 @8 Q3 P7 r8 A& J% X! Y7 t: Q    我们已经学习了4种开发和部署智能合约的方法:
& V$ ?) {  T/ I- O/ [: C/ i' ^+ d; w) m. ]  k
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。$ R9 k; F: L/ p" j" Q
; D3 k, I: I3 G4 v# T- x6 g3 s0 w
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
$ L5 R/ o+ d% X% m% s9 d: O  X. v- @6 H0 W9 k" R
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
7 l- a! x  V& I
% l5 F1 h2 T, j6 F    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。" R' A1 [5 i" x' Q$ C! B( F

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

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13