Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:8 K7 o1 J: {( K" X* q8 U# d& p- S

; ?0 w2 P3 |1 u    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
- r, ^0 ~7 K& j' T6 w, U" G3 K2 r3 Y, U; W
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
$ B/ M" T# [( m0 [, r& C2 j7 [, ^. G, m
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
. O9 ^! r$ [7 n; \9 L" F1 K1 F; ]# Q3 C- Y
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。$ ?* T9 f! A* F

+ p+ D) R" d4 X8 O8 E    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
* T  U7 {7 T) ?0 j: I- J' Q! C5 s7 `2 {% `3 ~% `' }- \
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。- y. A5 a; L6 F. b" W2 t+ ?8 l+ b

7 c! |  a3 h7 v( u; n' y    安装* P4 o. @: j( |' H) O. Z

$ f+ Z1 e; M) _- C3 _8 a    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
6 D% ]) K! d, h; m7 X) ]6 h; X* I5 x! h
    Truffle
5 e% k4 M5 J+ {% S7 g* r
1 o) k% D' G# W% c    打开命令行,并输入:
' _# E7 ~1 f" t& {. t- m' ^1 j" e* v- j# H  C
    npminstall-gtruffle' z' S' r0 l$ ~; M: m7 W8 H
- m; ~/ W( {, {* {! ?. g- i
    如果出现错误,建议你多阅读有关Truffle的文档。; R5 Q( j8 D6 C% K
8 x& |/ H0 M& h" i* P
    Ganache
  z/ L; Z8 I2 I$ K; j# Y% R5 o0 z! d
    然后,安装Ganache的命令行界面:+ i9 e8 h0 a" x( A$ q
8 ?. G' q+ V& K
    npminstall-gganache-cli
  q) e9 ~1 }% E7 U! a3 \# l( U, x# T% N9 z
    如果你对此不是很确定,点击此处访问Ganache的Github页面。/ h; R  V7 s* G  h0 ^+ a
, t* \6 {2 P/ p0 i
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
4 R4 F( F$ x; E" S8 y3 K3 a: R. p. t: B$ p# B
    开始吧
. V% t/ M; o  P7 O% }1 ~/ l5 _9 q7 h( Y4 c
    首先,创建一个新的文件夹,并输入。
( {7 ]* N* D! L! c3 W8 P) f2 \
  n- \6 {( t* I! H    truffleinit
/ n  ~8 T( e$ x$ {# I" ?. ]
6 C" v8 C& O- }0 e5 L    它会初始化一个空的truffle项目。
2 `8 s  P1 G7 ~, o& k; d- b
. y2 C, x) p9 j/ r) z    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。/ U1 y4 P$ p2 [" m" U& N/ w

  G% x& q5 @3 Q# S) `+ P! @& g    将下面的代码粘贴到里面,然后保存。! P4 V8 o, }* T9 d
; ]9 O2 g) Y4 u
    constWrestling=artifacts.require("./Wrestling.sol")! l. T! K% P) J3 C0 b5 w/ Z5 J9 j3 a
. P5 j6 |  |4 p5 q, {' o% O0 Y; X
    module.exports=function(deployer){4 s( }& M0 }% D8 H9 E3 S3 h( @- l
5 r( o% j3 u: ]: \4 G" s
    deployer.deploy(Wrestling);
. L( L" e6 X6 j9 p9 e/ b. h+ X8 e
% n' {) z) s$ l: O3 K1 ^    };
+ }; T( c( [5 Y: ~4 t  V4 M3 c$ O6 ?3 q  N8 |; ], A7 I( s
    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
7 x  j2 e' A/ R+ A' p% }& {% u* f! l2 J
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。
+ D6 E& n' S7 }9 C
6 r  t1 ?% |: u    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
, \7 }$ z' n  N. }( l7 t3 S1 Z1 z4 Q7 c  _
    module.exports={; w9 ]9 H! f5 |

8 s$ e* q0 [& P$ p, ?3 z    //See: ?* D2 v& S; X# s2 C, G& `
, i7 I2 L; W. P2 b1 [" U
    //formoreaboutcustomizingyourTruffleconfiguration!
8 U: u( {( y/ B  e. l' \6 L) k6 {. X- n
    networks:{
. V( G' F* l; o7 ]# {" A+ d0 I( T* E) C' ?% K- r" @
    development:{
2 y0 M; o: D9 o( @  b8 ^% @8 m7 r4 b, W' i3 s: G4 q
    host:"127.0.0.1",
) K' J& ^" n, H. d, f; a
' K0 P3 j7 v7 ]; d5 t    port:7545,
  Y! W5 G2 b- J" P/ k- w$ E' Z6 ?
* |, L% A  j5 I" L0 l3 t# D  j, V    network_id:"*"//Matchanynetworkid
3 w+ @) R1 x, g% `4 y" `
' r7 u) [: I" S. X& F    }
2 m7 r2 q2 ]0 d% V* T8 [9 B( l! R5 ^  P4 R6 `% D" N% r
    }
% A9 W) p8 O( x4 E5 f9 M
! @8 L) M; o& Y    };
. L5 ?; \; `! B# ]) M7 H. r9 D* g6 e% @( |$ O7 h" A
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。) H& |; x3 f, b. O( f* X

* p9 {  A8 x) E3 C    现在我们准备在区块链上测试代码啦!
, M, Y0 ]1 s: T0 t
4 h9 ^$ N' k- L7 D4 f$ f    测试我们的代码! ?3 u9 E  W6 u) w6 y

( X, I" W) Q1 z    在第一部分,我们会使用Ganache。
) m7 M  c6 t% v. _- V5 p- ^7 K9 E' p% s- r$ E
    启动一个新的命令行,并输入以下命令:& j! L: {0 r" x

5 ^- W' u& [7 w0 G3 b% x9 q- l% e    ganache-cli-p75451 g5 x. [" `, s* q2 w

4 o, X  \1 {1 ]    它所做的,就是告诉ganache-cli从端口7545启动。; D4 I* X; E* R' ^4 W: h

$ X7 ]: Y  r5 T6 K    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
. x( Q. p) X- C) O: g1 h- I! q8 e# K
    现在,回到我们的第一个命令行界面,执行两个命令:
3 ^+ E) l/ n2 e; t, a6 @# ~: M3 h  ^( I+ Y2 M
    trufflecompile
9 [3 ^0 K- P" {! O. d3 y8 b
) k# m: j/ p& ~4 j' f    trufflemigrate--networkdevelopment
, ~! d* p3 |) P/ V( P" Q0 k1 p$ H; o( D: A6 Z
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
4 S6 s' I% P% u7 ?+ ?! b% H/ i. |  v5 g! r
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
) J* `  l6 z& g2 V1 J
, X# ^# L, [) x  s0 r- t# K    现在,如果一切都按照预期进行,你应该会在终端上看到:
0 M# N8 _3 \$ \
' q7 \+ I) J9 Q    注意,这里显示了实例化的Wrestling合约的地址。
8 q( S& q- j3 P6 E
( U6 D" ~( E& R2 F7 ~: \" V9 I: e: n    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:2 \0 u6 T+ C( ~7 W9 u

- k/ y3 t7 _9 d0 p4 _) e% U    注意,它显示了实例化的Wrestling合约的地址。% t7 @4 o' M6 e7 K/ f# {! t' }* u
/ Z. T2 E2 ?" @6 C$ V, X
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
9 T! @5 q( F/ U) u2 W0 F: B! B) |7 k# E% H7 r9 A
    truffleconsole--networkdevelopment( C1 m. \9 ]- W% |9 D' }: C3 J! P
" u% z. g& b, y- l/ u
    首先,我们会执行这个命令:) `' d' f; S7 I% Z
) w1 ]0 U- n; n) E- y; v* V& p/ k' t
    account0=web3.eth.accounts[0]
5 @1 C8 S2 L/ ^9 E. l3 H
4 ^2 W. _/ Y( @, |    account1=web3.eth.accounts[1]3 _* r7 U9 l+ ]" Y. Z  W4 w3 l1 T

! z. p8 o3 k: W* a8 K  J    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
. X' y6 [$ y1 ]4 S5 Z3 z! T, D/ Q. f" Y, O- ^
    然后我们输入:
" R( a0 H" {+ v6 _* h: u2 V# g2 O- E* S: F9 Z# j
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})
2 x1 r- A3 s  J2 u- d. D4 z0 A9 Y/ y! {; ~! L3 ^
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
( {( Y% ?. B( U# R
# [' `2 j! t& n# i: W; H    执行下一行:
! y4 A. e- c2 F! q& j- b% d0 C' r1 g
  w( C' c. P- Y7 `% c    WrestlingInstance.wrestler1.call()4 `0 f  u1 w: H8 H2 N

2 g/ J: N! d, z  L8 H7 z) L    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。0 L( b. p7 t5 V) t4 n) L/ J
' H! u) T/ ^$ L) E8 ?
    然后我们把第二个账户注册为一个对手:
% H6 e. c/ l9 M. r4 L: i, }" m' {0 i/ m% o4 v! L" N: c2 {( P6 x
    WrestlingInstance.registerAsAnOpponent({from:account1})
9 n8 t" A  L$ i$ T- Y  F4 I/ b/ p3 a1 s
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。& P+ k: F  ?9 P* p4 x
/ b. L" M% ^* g2 j$ I/ |: w8 d
    在执行这一行之后,它应该会返回类似的内容:
) c$ a) w+ T6 Z+ L  m. N; V3 }! k6 n! E% V. ]) k1 C( b& `. U
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。& c( I6 Q. w. V

( H9 D8 g$ V" a* ^2 c    你可以通过执行下列代码来检索第二位参与者的地址:
2 U5 _) t, Y2 Y2 \9 O( }$ W# H7 @& j$ |5 a  I& Y% J0 X
    WrestlingInstance.wrestler2.call()
6 ~6 H: K; w8 k, ^% j3 W$ G( b1 A+ L+ _2 c/ ]/ l
    现在,玩家们可以开始角力了:$ q0 O5 V- T0 u4 n" F, q* T

: c( [4 \  R; b    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
- ^" W- ^! i7 N" @1 W& k: o# L: F
2 N" t7 j# K3 h0 |# x1 [0 l, `+ j3 I    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
  B: ^* i' O0 Q1 M9 e5 _9 g9 a  E0 k1 w# N, V$ p  A. c, c
    //Endofthefirstround
. I5 Z& u5 ~: j
5 Q) f3 |4 X' x% x) g) P    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})$ c( @2 P( ?) g3 t
$ r. O( t" d5 [" g2 A2 B: z
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
9 [) S7 G7 a( l! \
+ s( K" u$ m  H/ I    //Endofthewrestling
/ Q, i4 r  |3 S: ^. @
! }# f, i7 D# v. \    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
5 n; p- [8 @2 w9 v4 c9 K' T0 ?
; i5 v& J! e( Q9 K4 v: w8 N, E    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。
* n* A3 i: Z6 i0 I1 w5 G. R. P
( W  W: G8 x) r5 K$ N    给你留个小练习:从合约中提取以太币。- W( H6 H1 k1 l" b2 w. r" C
% M; N5 J& p6 p% D  e7 _' m
    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
/ m$ I( s* A* e# G  F- s: \8 \5 X( A9 t5 n1 G0 Q7 G% U( \
    geth如何在这个过程中发挥作用9 u! A1 E; {) ^) _! n2 r" S

; [( U. ?6 v' k: E- ]/ X; M    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
$ w$ N0 f3 {! i. W5 S. ^! }# Y) M) e
    安装
( ~1 O/ |4 r4 q8 W  C/ G8 L: K! K) D
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。' F( u% V, F- T, B+ q* ^
$ L1 S  ?. M1 w* A+ \! O: K" t3 l* t
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。/ v) _. T  l! x7 a( B* [0 i. p

/ D' q3 |+ O# G; ^    创建本地私有测试网络! h" @$ W/ S7 s0 D

$ g" q8 l' f/ p    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。' U. T3 t% V; \

/ P( D% D- `% e" x) k8 q( @    {& m- Z7 `5 `& r0 G- e& k$ j
: ^7 W2 R% e3 A
    "difficulty":"0x20000",
- J! i8 k- j) s# P7 w4 I
; ?9 z/ ]) K5 y2 ~9 t    "extraData":"",
- C- @- s" F1 j9 I  Z. [+ R" r  @
    "gasLimit":"0x8000000",8 V' S7 E" x# Z- ^

' a9 r6 _3 a7 g2 t# c    "alloc":{},9 [6 T; j3 A$ ^2 P) D
3 d: e* M" N1 C2 X
    "config":{% \, e1 C# u, u- h

3 `  @9 D* d" v  p0 y    "chainId":15,
7 H3 E3 a( }- o9 k5 r- Y
' f+ H0 G  z9 S, _% f+ g    "homesteadBlock":0,# S6 K* S# h5 V9 `& T% E2 h. B
+ r2 t( e1 H/ Y
    "eip155Block":0,
6 z% @& {0 G  U% T' U3 z+ ^( P1 n! `2 y1 V+ w; P* N. B
    "eip158Block":0
) j# R' Y. Y* E5 p
! O# u' B) z+ c6 ]& [1 i! a    }+ M  s6 p; H9 Y( E
, J6 Z0 o3 `$ H6 k: `+ f
    }
7 X- Y3 g$ B( m  i) X. k8 I) @$ q- I% e, q0 a$ b$ A/ A
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。9 E4 w7 Q' r# f5 y
: D7 {: E/ r7 l2 w) y& K' k" W5 W" D7 ~
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。( g& H7 J9 X9 z
6 H( j; Q) v: D& N5 X
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
# p; ~4 n' o6 L" x# X0 {! H7 r
7 {2 f' [) ^' E1 _; g# |4 N  q' G    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。* v, S- P" c2 d! x  [

/ C0 \- c; r& x+ c8 W    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):9 z& }: `. C; j" ]4 `6 h2 f% {
. t7 S$ m# B' W$ w1 J
    geth--datadir=./chaindata/init./genesis.json
6 [: q6 K5 d; _! h- Q
% F& H1 J, d4 ~" ?& P# y    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。. E% G7 @, o# \( \- U

1 M+ \3 z/ p- T; [8 R" q8 I    接下来,我们使用以下命令启动geth:
  j& W. W3 W, ^$ C9 [6 c/ O! o( w8 o$ W0 r0 x" i
    geth--datadir=./chaindata/--rpc; @4 b( D: t0 Z  |8 P
) ^" ~: q  a3 a' t
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。3 B) T6 C) e6 R3 E* I

% L: l. o/ C' A5 u( V    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:; \+ s( H* m8 U& Y7 w( a
$ N* ^+ R5 e" n* O: p  H2 o. ~# s4 y2 U
    mist–rpchttp://127.0.0.1:85459 h: L  \7 ]; f" @( M7 d5 D

/ e; g6 B% i4 u' X    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
  I6 y. }% f& u! Q' O4 Q
6 P5 Q7 ]  @. r; ?    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
0 J' d5 c: K; a! h1 T
1 ~4 `" g+ L7 e+ Y; P" q! ~5 H    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
. r- a' X3 _) F8 I' c0 b& x% M6 C. L% q! B4 z* p8 z- P
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。4 D7 `3 z: {& V0 z& D% s3 K

- i5 v. O9 V9 y+ A& v    打开一个新的命令行界面并运行以下命令:
/ S$ I, X& u6 }! ~$ {6 [. N% X# X2 A" t2 x
    gethattach1 ]7 l; }" L" C/ G% p/ r' j' v" R

* _/ z8 h+ x5 Y% G1 \  }    它会运行geth的控制台,现在我们可以与它进行交互。
$ {. \4 w/ C4 T  k& T% X, j4 v( _# c3 V2 f# g/ Y6 c+ X& x+ p
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:) }  t; t7 g- N( c$ V4 W5 w

* _: x! k& w/ ~' ~8 {  ]    miner.start()
. _2 I; v: d; ?# H/ w, V7 E: S. T1 Q% h1 W9 J" ~' T; a$ j2 {9 p  ^
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。
2 g1 q8 N% ]# M* V8 {; o$ d' a( `/ r4 G
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。2 C  X% g  p7 V

+ `. |+ ^) u9 {) Z5 c- }$ ]( Y; R    现在,再次打开“truffle-config.js”文件,像这样修改它:; s. ]+ T8 D5 x4 \/ D! h1 T8 F

& C; G8 Y& v: G9 c, g    module.exports={
0 ]  D% h% }0 |% w; w
9 ^! b" \  T, t) \8 m# l    //See; {2 ^7 c9 `# z& D# V  J1 w+ Q
7 V/ F; C/ [0 w7 j* y  M  T
    //formoreaboutcustomizingyourTruffleconfiguration!
+ o; t0 O  [( j( _9 c* G  T
4 R4 q% f3 `6 C! _$ Q$ G" v    networks:{" Y; D2 G* M4 Y

5 W) X) H3 S* Y5 M8 ]    development:{8 l+ J9 `# M) T( ^% Q6 J

8 T- |- s0 J+ H( L5 I4 t    host:"127.0.0.1",
, k. T$ I# l$ A' H8 e5 ]+ |7 _2 X/ K
    port:7545,& M7 C5 |0 F4 N+ l, J) J

; d; b# ]( p# ?    network_id:"*"
* }4 P/ u3 F- f6 Y. g
2 s4 z$ |; s4 o: ~( H    },) m3 l. t* [& W) F$ m
+ b' _4 u! [2 {
    ourTestNet:{2 v4 b7 K" B- S6 O9 ~) F' R3 C

1 j5 G7 m0 T% q  e2 J6 V9 w    host:"127.0.0.1",
% ]( A- w* F  \, q" v3 Z/ a3 H
8 e' `8 P  [( m/ x+ g4 e) {    port:8545,
8 ~0 P7 k# K' R9 t3 B/ m9 ~
. H5 v. {$ p) f' w' A, u    network_id:"*"0 h7 o/ w( i3 t; L! Y2 T0 C8 V
- w, P3 a, U* r1 P+ ^1 `$ P
    }
8 w0 K0 F* H, m! r; t* o( A* b7 Z  G
    }  ?2 [5 b6 H$ B5 _

. q* S% ?8 X9 g: Q! T    };
: H4 Q" M* s% f( a% O, D- E
+ [- e  r4 _. E# y2 @    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。# \9 u8 P. _6 \6 f

9 c6 d3 Y9 R% N, n2 b' |+ ~' k    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:  X% ]5 W1 s1 t% u* w
3 s. p. v. ^2 @/ T0 U
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
* P& v4 h9 I* g2 j( k- c; s2 c. I3 [& q" e- e
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
8 K2 Y* ?" A; }2 V+ ^) L7 o6 i
' w5 O& z" q/ L6 \    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
1 Z; B2 B; b9 ]- h: e* i2 K. D
; k; Z* I) E% x: _  ~; c7 _    trufflemigrate--networkourTestNet
3 \: z% M% X0 L. o- }+ Z0 k( [4 m1 J) }1 x0 z6 r. e
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:  ^# E/ @5 s7 A; F4 V5 _

9 h* D  [' n% b    现在,运行以下命令启动Truffle控制台:
$ B  ~5 B$ b" B  E4 a: y$ J2 C& A) M; p5 \% p9 ]7 ], U0 O4 ^
    truffleconsole--networkourTestNet
* w* S$ |$ k/ T4 n) [) r$ q+ A9 m6 I7 V* z/ |0 `( S1 _6 N
    然后运行这两个命令:/ T/ z9 N+ e) v( Z- E
0 {' g# Y" l% O. D% ~% Y% g! _: N
    Wrestling.address' s3 Z6 {! Z, c8 ]4 ~6 g! n/ o/ a, a

) X/ B" a. _1 a    JSON.stringify(Wrestling.abi): ^' T: ]" `- C+ H5 L2 L
4 t) S/ ~- i/ ]: ]# g/ M8 F
    你会看到这样的输出:
" Y- `' Q/ I( i$ V, Q8 s$ g2 C4 k% N' O. @7 n
    第一行返回已部署的Wresting合约实例的地址。3 F6 C( ]/ U$ Z0 J+ w

. s6 |7 B1 i* T% c9 i7 J  m    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
7 g8 L' j9 W5 w8 h, Y0 f: T/ Q
7 I$ ~5 E, E( T! I5 N1 t    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
- I; E* M, g7 L8 Y0 l. R# s8 \0 W: `: f' W) I7 Q
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。$ |. }9 U% b! C% d( p

$ k" B& Z  g7 n7 W9 D    然后,复制之前部署的Wrestling合约的地址和ABI:1 `9 e  A$ x8 o5 K& v* U) ^' U7 `

3 \( I: D* v6 _% A    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
  o  Z( k) P" j' I) E
+ K, Y2 T* h+ n( h    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。! |. B7 a3 O$ G0 l5 v6 R
. ^1 p; a/ Q" _, y
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。" k  p+ M: ~, O) F" @6 l) }4 p

1 f: X9 [: d6 Q    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。. k& C3 ?3 H9 [# y6 g: Z- {
% @% m$ d6 z% d+ f% }1 N; P4 {: Q
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
+ g( ~$ `. H% H1 C) r4 L  w6 [, Q6 }
    本教程的资源库可以在这里找到:4 ?9 O% b1 F) ~0 _" \
6 E; Y0 ^$ O$ {3 j% X: G! s
    devzl/ethereum-walkthrough-2
$ }& A8 H4 ^& S/ Y) S" v' @! S9 h' ]& Q/ [* H  j
    总结! K* C8 f8 o% b4 S" n' b

6 c, C/ V- V' ^- e9 _6 Q' \    我们已经学习了4种开发和部署智能合约的方法:
# ^8 y% }+ P3 i" ~5 b7 J6 Y5 ?5 u3 H
) ~! }' J# M' ?6 Y- r) g, i    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
: Y6 L! |9 t2 q5 P! P: ^
1 }& Q/ _1 {' i! V) d2 m    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
. W% ?9 D# I8 J% z3 R
/ D) U& |' F0 `2 R4 S8 q    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
7 {  {4 F; e2 F& L( ^: K, s( ]6 G  Z8 p: y+ m
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。
- [. J' h+ ^/ j- }- B, I2 s* U" n% K; p8 d7 t' D8 D
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13