Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:, r3 B" u) ?* o$ c6 m5 s5 H' G
5 ]5 B7 I( `; ~/ Q- l
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
, k/ L7 u1 J( t9 P  Q3 }4 S# J
* V3 A# Q0 b; M/ C! X    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
4 g0 h8 r- p0 R9 Z9 J7 I# |, d# d) R) O3 |8 Y+ k! X
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。2 z. E) o" G6 u; |% D% n- u: _' V

( d/ x8 e6 C! g    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
& j: ^1 P+ @: {* i6 c$ ]
; c: c5 h+ G  J/ d    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
  W* B  S" y  H3 U6 |( ?' Q$ R2 c  x% ~8 O) j3 h) @1 |) m
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。  R& A3 Z1 N* R& ]! D1 J- m0 U
3 v9 ]* _& X6 K2 j5 C, @8 G
    安装2 p2 }* e- g7 d, Y' c2 @$ x  y

- ]% l, ~" J- ], Q  I4 ]) j    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
7 T% ^9 l. W! G
0 e8 b& }7 f$ _: c5 K# g7 u5 R    Truffle
  g8 R8 F! B5 L: e+ a& P3 E4 ?$ A" N4 s/ ]/ x- `* c$ l6 K
    打开命令行,并输入:# G0 W& ~6 i7 X( h
. e* l$ ^8 v* {; r* F* a
    npminstall-gtruffle( z- S+ M7 U; r/ ~- y# f/ _3 z) G3 P1 x. @
$ Y! i* _+ {. p2 R
    如果出现错误,建议你多阅读有关Truffle的文档。
  u2 H* e0 _+ L1 c
# C+ P' j/ q' i; G    Ganache! {' }2 ?1 `/ L/ M" u2 n$ x
% u1 J6 c7 P' l1 q1 t. v$ n$ Y
    然后,安装Ganache的命令行界面:; I( N: C+ w/ ~7 L: @* r! H/ j

# q7 S, [% {! N. |1 X% U    npminstall-gganache-cli
! S: X4 ^: F. \2 y/ `. k' a- X( ~
3 i) ]/ c; ~& S# p" [7 w; J# {    如果你对此不是很确定,点击此处访问Ganache的Github页面。5 ^! _0 d8 _8 _" a3 s

; k0 Z. D$ Y4 o" ^( L    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。4 I. a' g3 q3 Y! l
5 ~2 G8 l, O, x8 @+ R
    开始吧
- M- E: Q; E" L" @4 _$ @0 o( z, _8 V! M  F/ X3 j( V  I
    首先,创建一个新的文件夹,并输入。$ R; }8 ]2 H/ H6 F: I. d7 r. E

3 x8 Z/ m. a2 u3 q* a$ h    truffleinit/ P2 y/ z! {6 O1 B& r9 t# }
  ?+ t+ ?" i& ]5 Y: i
    它会初始化一个空的truffle项目。9 Q) Q. b, T+ J! U( a  M4 D/ g

9 w1 v& g2 b. n- i1 k    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
0 j9 O, Q' S; n1 d9 c* }6 C4 a, B* _( _" c
    将下面的代码粘贴到里面,然后保存。8 s; f9 Q8 R- |; t/ T5 ~0 u) L4 u

; g6 W; o" c5 L4 q; `8 Y    constWrestling=artifacts.require("./Wrestling.sol")) m' d: d) ], F( h, u" ^6 I
& B2 r0 q6 r3 V/ B( `
    module.exports=function(deployer){
/ k+ Q1 E9 a) _3 C/ v
9 Z; {, n  e2 e1 ?2 A. r  D    deployer.deploy(Wrestling);
# W4 P- u! y6 z7 c- t5 N  S" i, [  ^; L0 ?# f& v  ]& W
    };
& m! U6 g3 f* n0 {! J' F* L3 K. p! a4 r5 u9 S( j% |( D
    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
4 i! T% c) W' E9 ?& Q
6 p3 H+ r( P3 m' G5 _3 [& i4 h    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。" |/ k- h% b! T' e$ l0 m& W" i

  P+ x! k3 s; T7 y    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
/ r9 b0 F% Z% K7 F' N1 ~
* o/ K3 J2 d5 p* A, |  l. [. G    module.exports={
( o! j* f7 ~+ @. R4 H" j0 H
6 z: G5 |" n4 b2 D    //See
# W' M- j* h+ ~" i% X8 I# {) c2 A# @; @! ~, ~. f6 H
    //formoreaboutcustomizingyourTruffleconfiguration!- R) S9 E+ r9 l7 d9 J

0 O& {6 B6 O) r  B    networks:{
5 B6 X- A( }6 ?- [( ]4 S) \0 Q8 V8 a
    development:{6 Z7 N1 T& z# A/ s

6 t4 Q! E- `2 A" E5 F  n' `    host:"127.0.0.1",
  J# A$ w) {$ g
; L! p& O1 q' ?# T* s    port:7545,
$ M1 p: N$ D  x7 Y$ D) U' p! U8 |, n; Q; ]% y% l
    network_id:"*"//Matchanynetworkid
  O7 `& o* E# ~6 e( H3 ~! q1 W- e1 w2 k
, B0 j: P5 `& H    }
+ j/ p% B! o( q  q0 P6 R  ]
% ]( Q+ ~; l: J' z. x; j2 I0 L9 K    }* x# G) P- d. W! L' j% V

+ j7 m3 ?5 [! {/ ?    };  T7 n1 o! z) a1 m' j4 z

; _$ R7 T9 B9 c3 g& q    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。; N/ w; w. E: G5 Y0 [. c

  c8 M( b1 H5 r- p    现在我们准备在区块链上测试代码啦!8 K1 ^" J" F# K; }0 ~7 ]

, ^" D1 ^# p5 V8 g, a4 F- N  i    测试我们的代码; a# j  M7 j: i

' T' N+ a8 W- [* J* C- I, p% T    在第一部分,我们会使用Ganache。  l; c! n' A" `. b
  Y0 s7 N% q: Q6 v2 Y+ m# ~) i
    启动一个新的命令行,并输入以下命令:# k9 f, w  [0 q* i. m. t' {5 q6 m

6 g4 E# `2 L! n7 |4 a    ganache-cli-p7545& u. h6 |. T4 X9 h! |% a  V
; `+ `/ G. a  A5 I3 R) r3 v
    它所做的,就是告诉ganache-cli从端口7545启动。
5 b1 n+ M6 p" d- V' b
0 ]7 k! N4 o! ~# P' H    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:  v6 Y# j* s2 y

6 ~* i4 |5 X8 N    现在,回到我们的第一个命令行界面,执行两个命令:
/ M3 @# q( ~- H' {4 L( X* R% C* U' U4 Q3 S8 E  n
    trufflecompile
% c5 B$ z/ P5 Z& N" ]2 j# C8 N: l3 I% n
    trufflemigrate--networkdevelopment7 Y: p. Y/ \6 x6 B8 ?
7 Y$ c0 b5 y$ q: r) E# p* u
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
! d* Z/ s) K' b: \3 d
. F' l9 u7 u3 j5 Q" n- A    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
3 x: q- ~: T2 M+ u
: P# y) j' J( t) ~    现在,如果一切都按照预期进行,你应该会在终端上看到:
0 `& ?0 a1 _, o% b$ M1 {9 i2 A
) ], A( J3 m3 o7 u* O6 R    注意,这里显示了实例化的Wrestling合约的地址。2 r* y' N" ]  E

  B# w5 u) L+ _# k. l    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:8 Y+ k- Z/ I% w2 V- z7 N' G
5 e1 n3 H) i' p9 P2 F! @
    注意,它显示了实例化的Wrestling合约的地址。
. M- o  C1 e/ X$ ?2 I' Y3 S
2 w: b" [" F# a    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
' y1 o1 e/ }% P- k" X; W/ d/ N8 g6 \
    truffleconsole--networkdevelopment
/ k0 n9 h4 S  t: P! n( Z* ^( x4 F! K, U. K* g/ Y" M$ ]
    首先,我们会执行这个命令:
6 _+ ]( J+ I1 F8 v- Z" T
& h! a* x0 J# K9 t0 n5 t) l    account0=web3.eth.accounts[0]
/ ^0 o9 _* z; h4 o8 e
& J6 i; ^6 `( K7 y    account1=web3.eth.accounts[1]
( {9 P! l8 q; K( f' D6 A, @8 c& k$ s* Q4 v$ Y
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
/ H8 r8 T+ N3 _* s4 [  V
: ]3 _9 l' c# j# U! \    然后我们输入:/ {5 \9 i* d! T7 R- T

- ~0 m7 I) Q% r4 a    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})& b; G& d7 d+ R5 b# X. A
3 B3 Z/ q5 T' T' J( G" @8 j0 C
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。" j2 ^1 }% K7 [( q* m+ a

  i( k- X* A* }$ f2 x7 j# C- H    执行下一行:$ N5 C0 e% z: A5 v+ U0 y
9 H$ T, F5 P: Z) k
    WrestlingInstance.wrestler1.call()1 E8 F3 f4 m$ f
7 t* }5 m+ j, C, S8 T
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。+ h+ d2 N6 ]2 {" b# K6 }
- V5 H2 ^' @0 Y- Z/ K: y7 H
    然后我们把第二个账户注册为一个对手:2 C. t$ ^0 Y7 F- R
; t0 e0 j% _6 e
    WrestlingInstance.registerAsAnOpponent({from:account1})4 `) M' M: p+ B

: o" c( j9 M/ x, O( v    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。% T$ u2 f( K6 c3 T" e3 q+ b
7 u0 y9 b" a8 g6 U+ T' X2 X
    在执行这一行之后,它应该会返回类似的内容:0 C+ Y$ Y* N) p# o# Y
5 m5 }6 I- ]" e/ D) {3 Q% k
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。% C! n- r- x' |& t9 d

7 l7 t* n! f0 z    你可以通过执行下列代码来检索第二位参与者的地址:
% G9 s( o4 q$ `; Z7 y$ ]& R9 q/ o; C" |: j( x$ b* y
    WrestlingInstance.wrestler2.call()
  I& j$ I# Q2 x9 B$ u4 |& w8 S9 w# F( V
    现在,玩家们可以开始角力了:
! O5 O' Z3 ]8 E% V! P/ S! o( I
+ L7 s: M- a: R+ q* w+ V* K) F    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
, f% K5 n' Z" Z4 Y
; w2 f$ o' @$ f& j' b/ T- B    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})+ y+ ~  f7 D2 H8 W3 f3 k( K
/ M2 m6 m. D* z' U6 E
    //Endofthefirstround
. h0 q% l5 h6 p( J; a2 F7 W! e3 q5 l2 z4 i, b" |
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})1 {8 Z4 n4 _! p4 o$ e' z$ k

6 U) u" a# x& d; \    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
( `5 p" |# A3 g. [$ l# E* b' Z  n
    //Endofthewrestling! _; b' {6 W! W8 ]  K0 n
- s1 {8 c4 }+ S2 X
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
" I/ G* D' K1 g2 x- q$ d# ^, I4 x+ ^5 \
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。' b$ a: E5 q6 \* Y/ Z
! `3 H# y: p5 d# y+ q; t" S8 E
    给你留个小练习:从合约中提取以太币。4 _2 T$ y7 ?! c0 l. q2 D5 \

1 @% ]: U: ]% A* B' e2 H0 F% @    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
1 t; _, `5 A3 e, ?1 F+ L
! ~; j! p+ A6 E5 \% e2 s1 F4 U0 ?    geth如何在这个过程中发挥作用
3 z+ m/ y% o  x$ C( r1 b1 i; p: \
! p: U4 m- J7 d" R5 `    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。& O  h% O! v; W! t$ P8 d
3 ]2 V. L6 e, t5 e6 V' }
    安装5 N: J; Q& n3 O7 [
2 }# f+ j3 O$ z
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。
# E! S% Y* i1 @  N: }* k9 p; Z# o, X5 D6 f- p
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。, S  d5 t. R3 C  Z9 V0 e
) ^7 t2 N* a& N, b5 y6 k; p
    创建本地私有测试网络
0 o' O" h. e- y% ^9 B6 P" c# @( ^
    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。0 W  j: Q' n" A! l2 f
) h* f- i. i4 r  [3 M$ l% M* k
    {- ^! C3 w# _2 c9 a* n- G
3 q5 c' n! E  [9 L; E
    "difficulty":"0x20000",
0 x7 G) \3 ~) \  ^9 D( i! q
6 p5 I" V0 Y+ X; l    "extraData":"",4 E) [1 B3 X. d' X) K

3 T0 A) t9 p/ x    "gasLimit":"0x8000000",/ u6 R% [6 j8 D2 R) Z

+ h* d9 a" j& t1 C/ V6 m    "alloc":{},
0 r! A8 X5 p: L1 d
9 v: \2 z4 _$ M: J- t0 a# h    "config":{
* O3 b9 d7 }& t' y/ z* G. r! C) F5 e0 a* H/ P* U* K, n/ D+ a& J
    "chainId":15,# N( z& G7 u6 J( Y" Y- ~
$ w% p, i2 K6 a% Z2 F5 X
    "homesteadBlock":0,
9 |# R9 c; K* X7 Q$ `, W# [" y# `( e! f* |
    "eip155Block":0,7 e1 p3 l/ i' M! S4 x

3 m8 e( i9 Z( m    "eip158Block":0
) @- G2 h$ v  H$ n* f# Q$ c7 }, `6 p8 ?% n9 s) p; O
    }
! [* ^; ?9 ^8 c  A% {( m6 ]8 F9 h: J% ]
    }5 K, H$ P+ U: c+ D' r; T9 X, K
! B0 J- ~7 L! Y! c/ V& i
    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
" |. K1 V1 `$ }7 I
/ x- \: ?7 {/ }4 S1 p    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。- N3 a- O$ e; c2 F
8 l, c6 G7 ^9 z" r5 j4 I. q. ?
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。; S: T4 h8 b: m$ {

. s! D8 C$ K( w* u, x    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。! l2 [+ A' I& y( g

0 I' ~8 {. }& }5 v3 D% d% ^% k* U* e    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
8 {# H9 R6 \& ?, F2 Q0 a; Z8 Z
    geth--datadir=./chaindata/init./genesis.json
# P) W  ~1 R6 O5 K
, r- x( E# f- t! s    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
; x- Q% M. V  t% a2 j; A
: q" ]1 Y; m7 j9 _' c9 _    接下来,我们使用以下命令启动geth:9 T# }; X$ n) z& O/ P

  S0 d# u5 z( t, \1 `+ f    geth--datadir=./chaindata/--rpc
. f& o3 b% V! \; s! n( f/ s9 `. G/ e* U
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。9 \: {8 B/ j8 e! N: B* }0 @

# @( d, a& Q- E: m! }# j3 p3 |+ v. M    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:! L$ h% @! X' _+ O- {! i2 W8 \( N/ U# z
, x/ n& S. l3 r+ L; y  z
    mist–rpchttp://127.0.0.1:8545
* T- v8 B% d0 q+ H6 H, h8 Y2 C6 L8 B6 P3 D* p& D9 B
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。- w# }: o8 {9 r3 t$ x$ q
5 T, y0 P6 d; r& W6 N5 k+ s+ ]
    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:7 b" F# L2 `) \3 E1 |/ |; k
0 c/ C# x7 f1 |" V) L/ Q
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
9 j/ ]" }" s! o2 |' a2 ]7 `$ \& U% I
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。6 J* ~  Q/ T) A& P& K9 O7 H

( g6 ^2 K  V( V: k7 J% T2 w0 z    打开一个新的命令行界面并运行以下命令:5 ~$ H2 K- f) H$ S. u3 I& d

$ q5 Q/ _4 }( n' Q0 _; c7 o    gethattach: Q: @; V( c, Y% m9 K( a
/ F* E; _0 a- h! k7 o7 R, U
    它会运行geth的控制台,现在我们可以与它进行交互。
" |" n9 Q* ?! |& L+ L1 h
; o' a  T$ \* C$ u+ D1 \    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
3 X' R4 Z0 I& U5 @8 K$ k0 C- J% w6 E) J- G- @+ X
    miner.start(). Q* c; S+ E1 L2 D

: O  f5 O0 S/ s$ W( `    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。
7 j) }4 h7 {0 F* d
4 i( q7 W/ u/ W! W: A$ u    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。. y( k' ]- M! ]/ L9 |8 P1 g# j

. G) T# u' _. Z2 f9 F    现在,再次打开“truffle-config.js”文件,像这样修改它:: @( V2 ]0 ]2 X

7 r3 o7 S  H6 ~, r* p5 b    module.exports={
' \# z+ [% ?. D  Q+ r& x! \* A3 T; J$ J7 Q: v
    //See  @8 S/ n) e& G# R$ F& a( f

8 D$ G7 E. Y' m$ J    //formoreaboutcustomizingyourTruffleconfiguration!
) y+ x% J9 \5 l; ?0 D! \/ e! Z* i$ ]+ J
    networks:{; G: A( ^3 h$ A& K$ W0 @- G
- c) G0 e7 \( R
    development:{
( Q7 ~# `+ r* ?4 H2 a
* |! m5 l/ Y# F! `5 t    host:"127.0.0.1",
# z5 T9 Y% O3 ^3 |5 \' Y
/ z5 l& V# s  \% P2 k/ A9 n1 F0 d. w    port:7545,& Z% E; [0 d1 |8 K5 B7 T
4 ?9 N% t7 O! S2 K; S" y, s) ]
    network_id:"*"- @) k4 ~' B& B% K7 b
; I" `3 v5 X" A& s
    },
: R  w8 D& c/ D7 A3 t& ~
, [7 M6 [4 {0 Z6 u0 P0 Y    ourTestNet:{7 @) p" E) ^" B) _$ [0 w& G

( b% _( Q) Y2 h( A" M1 o    host:"127.0.0.1",
- G5 s1 s/ o) F$ y0 L! P( r
; g7 v  x% c+ w( U* g    port:8545,/ ~7 U0 F" v0 g* z0 v6 v; T
  C) b" d9 x. M" t/ I
    network_id:"*"$ N' q: x3 d! ~' D

( O7 c, [' G0 ~    }
9 C3 h4 S6 Q: i5 v+ ~! O) P3 R) u: e0 d/ D2 Z
    }6 A, f% Q+ C6 n2 J2 e5 T

  \: p5 q) E+ z& ]' q    };# w, f# ?. ?: @2 b7 k% r  i8 u

' ^- w7 `8 V4 ]( h; I' L( Z8 s* d3 U    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。3 y: s; C, _( y0 w
6 J9 R5 ~+ d1 [1 e5 D9 K
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:. h# D& R3 `; w' q( R" ]+ |# B

5 K, q- x' \# v1 y" T; e7 s+ F* X    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
! ]7 T  p3 b9 x2 s; k5 h/ ~0 L3 a( S3 b0 k
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
6 U# |; w8 e4 V& l2 K7 q! n( e' v4 e0 l& ]& a% I$ Z+ u/ [5 R$ M* E& U
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:; L: H. v5 c8 k# m, Q. N, i
6 K% o: L5 ?* C2 o7 U
    trufflemigrate--networkourTestNet. S* U; u# ^% G* n% B5 v
4 U: l; e4 B6 z4 a+ v! k* I
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
! m" ~+ h; R" F6 P+ Y) e' L, U3 h7 L9 c. v! L
    现在,运行以下命令启动Truffle控制台:+ I1 `6 ~7 r$ R: H

6 l# v- ]" l+ n& S2 T    truffleconsole--networkourTestNet, ~5 Q- }# u( G+ S$ S. Y% x3 s: M
8 O% J- s: ]0 j+ N4 b4 ~
    然后运行这两个命令:
5 |! W5 M1 S. P$ C8 B+ d' p0 R" F4 s" K- ^
    Wrestling.address
+ c0 d4 o: ^- V0 y
; R# \  f" P( i    JSON.stringify(Wrestling.abi)
. V9 l3 C/ w/ r- i% j8 N) _' Q  o* z" z- z! e& u( ]
    你会看到这样的输出:/ x% I$ Y/ Z/ T: N. V+ ]+ O& l2 T

: m9 \3 f/ X( n4 Z1 Y$ o    第一行返回已部署的Wresting合约实例的地址。
2 v, h' `: ~; C. I8 F1 z
, g/ a$ y" S' d" \9 e, Z+ r- m    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
5 @1 [/ Y; Z$ o2 L7 ~
9 x. {( N/ m6 y4 v4 ?3 d% s    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
4 Q" y2 \6 ?! E6 O$ a! m6 O- u
. W2 u  n6 G3 q9 K% E    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
3 o6 N2 w0 h9 G: Y5 o; b( R
$ `) b; N4 z$ z; e, R& I- W    然后,复制之前部署的Wrestling合约的地址和ABI:
4 ~+ g4 F1 A, p! ~" U1 _4 r0 i6 G5 z; x$ u  ^' g- _
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:3 o9 C* z. D6 e' n" Y

" S  A. K. u" J0 |. j- q! s    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
1 X& d: X: K" ]# G
: x, F9 \! L/ Q- v3 \; ~+ z9 j! {    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。
. r9 j6 o; U8 c* O0 o
! ]3 y' \5 E' d. @    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。5 E# y; l1 c+ k1 H: |9 F. [% s* L

1 {, ~+ \8 B/ V' }5 I% r, D    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
. r3 H" J! E& C5 j8 W
! c4 p1 ~2 o$ \- L1 i+ P    本教程的资源库可以在这里找到:# K! G/ |" @* H1 A# `6 E+ w
: c! F" n# x* F/ m! J
    devzl/ethereum-walkthrough-20 E! d3 H; b7 y1 z

# _% e$ V  ^7 t, O    总结
/ k. s$ g) P# f; p& E, M  p  \" [% C
. O, e  d) m+ W    我们已经学习了4种开发和部署智能合约的方法:  n6 r0 X4 Z) X/ q" y

2 B' }2 f' l. z2 ?6 }9 e    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。# F8 j+ v' u3 f3 y$ i0 q$ A  z8 g$ N, b
5 m- _6 K0 X- @) q% F( a) K& U
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。% p& ?4 s5 v$ I

" t; ?, j" I  q, s9 u2 D    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。* A: V* T; k5 c  S5 f$ |4 B, R) Y

6 x6 h! o2 h' h* P/ _% R' r    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。
( X" g4 Y# X$ w
; X% ]; V' P3 T! o3 G    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13