Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:5 d/ A0 m" X, C% B& ]# Z
3 b9 ^0 R/ K9 D0 l2 B# `
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。/ j. G/ ~6 p6 Y5 r! I9 s: }

1 n) Y, o3 P/ E5 x    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
: _. S+ S1 d3 m$ b0 D- b
4 P  u4 W9 t& P) m8 q: Z, N    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
' _( J2 r  {) E. z3 u2 R# l& S4 H" n$ x8 m
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。- b; u6 r! s2 `, v0 i) S& }( I
7 w0 U$ h8 A/ s4 |( D' H# ?
    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
9 f. P3 A+ D: G' @* ]' _4 D7 Y* L
/ K- C4 f+ g9 b6 k    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
7 R; {: _5 o% c5 i7 ]" ^1 k3 W/ M- t0 h' a5 }! t$ X
    安装
3 F1 U" t$ y7 U+ d+ C/ h* d  k! ^* L
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。% k# A' [5 c& X/ P! z: d

0 T- S: h3 [1 R- }) x1 J; r    Truffle, t  ^3 G! w; O+ H' u. W
$ q8 Y% g( r1 [4 \
    打开命令行,并输入:
$ }2 ^! x6 X( F) V0 o/ k1 j1 D; P. _5 L. p
    npminstall-gtruffle' b- `/ p; T8 z4 t5 {- ^

' T" R5 }" H6 X    如果出现错误,建议你多阅读有关Truffle的文档。
/ d7 i3 D: M$ g) F) b5 v1 Z
* V1 k( s# h+ o# p    Ganache
$ m7 o! u, v+ ^" k$ L
2 C2 T! ]9 }- x* Z- }9 o    然后,安装Ganache的命令行界面:3 c4 Y' U, J, S3 `) B# D2 t
' W% U9 t( i% b0 |! i
    npminstall-gganache-cli
* g% D4 j0 f; g" _+ ~( I, D3 \7 A6 I1 E
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
. E' p6 l, x/ ~4 Y( q+ @3 W8 [' B* T; V) H) j. c
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
! }* J5 b1 b8 t. q) y4 A( |5 K! `' C2 l/ l) A
    开始吧, {' M$ W9 n+ ^7 w' s

; B! M% Y9 U8 w5 r7 i- c3 d% J  p    首先,创建一个新的文件夹,并输入。
0 v) r# ]" H+ w" B. d3 ?' C- }5 ?, Z( q2 }6 @( y
    truffleinit5 E! G6 Z& _: a* D% [6 z
; Q! p. A2 d; r. o0 S; g- l4 ?$ S
    它会初始化一个空的truffle项目。
( f4 }; ?0 }3 T0 L
" Q2 O2 B" h% P% X    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
5 N: C. D+ U7 k8 `- I* k! l" k0 m% {
    将下面的代码粘贴到里面,然后保存。
9 J; B% Z- D3 b6 a$ T, `* V9 K+ y4 o4 ^! x1 z' k
    constWrestling=artifacts.require("./Wrestling.sol"). q8 g+ I9 i3 y! }" E3 t" C. N. q1 m

6 C# X# b5 e# H1 |/ G    module.exports=function(deployer){0 ]- @. a) s8 e, ^

+ I0 ~6 a( K+ H1 w6 {; r    deployer.deploy(Wrestling);8 j7 S: o. a1 Z8 [5 T1 x2 G
$ J! \, {3 s) `, s  Q9 `; N
    };
/ g# Y3 G( I1 P" U4 d+ O) T0 V
2 ~( h7 B% H; u+ f. n# c9 R* v    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
$ ?' C- f& C: h: s- \
! s, g, @8 o! P- Q4 e8 l2 U# w    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。
. Z5 ?8 {: N1 w1 B3 ~; ^2 \
: I. y4 z0 L* ?3 a6 L! c, d4 {    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
& i4 t" N# u( q6 ~: J& k2 p. G" A% y( Z4 ?3 R
    module.exports={: g8 E7 H. o8 u  }6 N: v
5 m% @: P; n% f" z
    //See
* E+ f, K. N& L0 l0 k/ u' }8 Z" x
0 o6 s8 o1 x( `2 Z& O    //formoreaboutcustomizingyourTruffleconfiguration!% @9 V+ |2 D# ~$ r6 W

7 Q' y) G: O( t, `( ?* p' v+ f" C' W3 d    networks:{7 m0 L$ U3 ^$ Q) r

+ E1 f& k- h/ K  K7 z+ e* k    development:{
* U2 K$ W8 p: t! f' C3 W! C
/ Y# y2 O6 {( A+ w1 }    host:"127.0.0.1",; k; L4 w, K) X( e& E. }! g

% n( h. n/ r) A, o    port:7545,- S6 s0 g& W8 }/ F
7 Y; {. V3 L; G/ z9 C
    network_id:"*"//Matchanynetworkid
3 I- E: p7 c+ s$ R: t* @* N9 D: ?$ i$ n0 ?2 h
    }
# Z4 C  w+ U1 a( m. n6 i
2 @2 x  V- T. B# O# \/ [    }6 m; G' h% ?8 J. `1 Z! X
7 W9 l4 Q+ x5 U
    };  a: ]4 H. V: W2 O# t, ]
4 _, B, t6 \6 t, e) s$ |" D" g+ w7 o5 f
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
0 g  V9 J9 ~" E9 E: u; i) ?
* |8 h0 V1 G! f; u  i3 J; \8 G, i+ ?    现在我们准备在区块链上测试代码啦!
# x& C6 d  \; [* ^
. G! l0 P& p3 @0 k) B/ U2 b    测试我们的代码
5 ]( E  i# j0 L- A
# O6 r" z! L9 q( a    在第一部分,我们会使用Ganache。
$ I' J$ u1 C2 R4 W
/ N) o1 q# T' S    启动一个新的命令行,并输入以下命令:* f, U0 |; t0 M# }/ M

4 M) p& r% ~, B  f6 z0 ?2 N    ganache-cli-p7545
" {3 J. b# l7 M, P7 {
: G  x* U; }+ W# w    它所做的,就是告诉ganache-cli从端口7545启动。% {6 Y( b* Q/ d6 B# @2 E" z8 h' `
- C" l; B) ]1 i( Q3 t5 Q- H
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:1 z* n  D5 f# H6 i+ H; ]

5 h0 w) D- W( k. r- o    现在,回到我们的第一个命令行界面,执行两个命令:5 I) c$ [- X8 v3 K0 Y
$ ~( Z3 z1 F' R0 ?6 k( |
    trufflecompile5 C- \! d; h  P6 W4 ~) a# i; X
4 S4 A3 S% R% c. a
    trufflemigrate--networkdevelopment
; }2 |* X, b" o3 O) C5 J( [8 n7 V- U% @# l+ m: Y3 a
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
& y- g4 E1 R4 W* Y  A6 {+ f3 s. e5 G$ I! {
    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。$ S* [! A; R# H. M' ]4 [" q& d
, y: m  y' A! M; h# C- ]" |
    现在,如果一切都按照预期进行,你应该会在终端上看到:
$ m# |% J1 L! m5 O+ b: \" A
9 n2 k" j  [$ V) Y8 @! D$ I/ T( z    注意,这里显示了实例化的Wrestling合约的地址。
+ d. w' W6 P1 v" w/ s3 f5 y4 o7 C5 p+ S8 J6 e" Z
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:2 `4 q1 T, z1 m1 ^# v
, n& c7 C* q2 @, S
    注意,它显示了实例化的Wrestling合约的地址。; h4 J; G2 y: }( H4 G
% L9 J6 X5 @! ^* |) A" i: J8 D9 @
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。0 x( v9 a" s7 `: R1 D/ c* `& S
& ?7 o5 [9 p  z0 q' ~# [. e) T
    truffleconsole--networkdevelopment
7 }# i$ a8 N9 h: Y0 B" }- F$ }1 E2 Q1 f  V. x7 d, }
    首先,我们会执行这个命令:8 ~3 c; T0 y8 s

( T8 ]( N4 D- n, z    account0=web3.eth.accounts[0]
. L  ]! D9 m( v: Y6 Q! _5 K- s9 ]/ {- i% Y$ o
    account1=web3.eth.accounts[1]- d" ]9 t3 ^) t& Y5 i4 G* S

8 S# z3 i5 p+ @4 g' D9 n1 h    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
5 e" N8 W& T& W
, j5 p+ ?+ x% x! n; X/ J% l    然后我们输入:
+ W) T9 Z2 _; r3 _. b( `& N0 Q" C6 v
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst}). g3 N! J: Z/ I- ~+ |$ z. d# w
5 M% M. i9 |- ^' t; d
    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。" D" r! w7 j4 m! r1 g

* S( t3 f1 N- u8 K    执行下一行:
) N: f( G( Q* E
( l( f  c5 h3 A- L' E    WrestlingInstance.wrestler1.call()! k8 g. ~* p' E- @) V8 Y6 \$ K7 r& w7 g

- l$ l4 y1 R. B1 B7 b    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
8 L+ ]6 ?( K  V4 O
9 W3 V3 k1 u2 Y7 l9 L    然后我们把第二个账户注册为一个对手:7 x; l& w2 C. C4 G8 u

7 [8 X1 j+ K0 g: f& ]# z' I+ v1 l    WrestlingInstance.registerAsAnOpponent({from:account1})5 T5 ?5 L6 q, t  W: l/ [/ u$ t
) u( U  A; F' P. D. ?2 [$ N
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。  G: v% D) l- z3 B$ X& q

$ N2 C% J& K4 h# s' @    在执行这一行之后,它应该会返回类似的内容:8 o0 ]3 s2 N7 M
7 j2 a3 }2 r' U; e5 W4 H. H
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。4 S3 r2 p/ a9 _  k
2 s( {( n3 ^- R' [" j/ h
    你可以通过执行下列代码来检索第二位参与者的地址:) y; h+ n) G' ?+ {; d2 |! f
+ n: n/ \$ U+ C3 I0 g! r: ?
    WrestlingInstance.wrestler2.call()
! W+ |& @6 X+ J% @3 d! R. D7 G' x/ j' n9 Z& F
    现在,玩家们可以开始角力了:
* K4 I6 Z! Z6 |! O5 a3 p# J8 Q( s% P7 F1 o# I" n+ s
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})8 w) {3 P3 @9 }/ b- t( [
8 v2 y' n4 \0 W: l* i3 r, w1 |
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
$ ]: z; p. v7 j: Y3 [! C/ Y& B! b* X; I. N
    //Endofthefirstround. F( U6 C. ~& A. g( L# w
( H7 r6 B1 l- _! {6 j. ~) k% ]
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})( q" W8 J" P; Q' n2 ]& L0 P6 v
7 V' X( E* s- u! W. H5 o3 Y
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
" _6 ]* T" j  w( L8 V/ I7 D  e% n0 Q
    //Endofthewrestling) b& _0 F3 k# T8 G: v
( C1 ?, `0 e# y  H! Z* O& U  p: B8 E% Q
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
( C- G' j6 j7 m$ @: `2 e" W* F" F9 ]" v: M( ?; y$ F/ e/ Q
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。* ~) p- }* t4 r! {4 J6 W

* [$ r% Z0 w9 x( q. X    给你留个小练习:从合约中提取以太币。- X! h! d6 V2 n3 c3 O

4 T. \# n3 s- ~  I3 d+ n6 ^9 ^/ {    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
9 w; n; k- w. p6 d5 Z7 g8 l" V- H" V* T7 Y
    geth如何在这个过程中发挥作用( m; u& T5 }& A& m
! q& l2 H7 |) E
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
/ \1 v( [! H/ j0 ]. {- ]4 ?/ s9 v  w
    安装
& v. {- V# U4 X  N( a4 _
" {0 c! E% q* `, r$ }; N) V% D9 x    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。0 ~# x8 n+ U( n: W9 ^+ {

$ u/ r& B( n3 Z( I( ]; h    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
: ]+ f8 O6 n: m% {3 I5 Q5 _
6 `/ F2 X# |; g  H! M/ |    创建本地私有测试网络% I% v1 C8 B+ c6 R6 H' y
( e5 D3 [# F% Q& d4 ^- Q
    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
" A4 @- ]: K) t( ?4 t3 `7 J
' t) W; i) ~: N3 E* T7 A    {
" q! }( s8 b7 A8 a  @: t: |2 e: O! R* o
    "difficulty":"0x20000",( _' {! P! S( h6 |. ^3 T
! ]( G0 ^; W6 z
    "extraData":"",
! _! R) i" J( C8 l% O
2 l# l. q6 O, x8 G' S. _$ w    "gasLimit":"0x8000000",
4 K% ^! C( N7 S( S5 i
$ g8 L/ Q$ T) ?; u    "alloc":{},
1 [3 I/ L. K: E3 O& A
  z/ u. N- a% f; S1 W    "config":{0 m$ h1 Q: ]! q$ G# ^  C

; q" p1 B5 Z9 P+ `. V$ N% s    "chainId":15,
$ b$ }& F; b6 v# B. ]: i4 P
9 d- k$ T# t# g6 U4 j7 U    "homesteadBlock":0,9 n! O, [2 v: Z/ V3 z" U

5 `$ J# g, N- g$ _" i3 l+ t+ L    "eip155Block":0,! C) f8 V; W6 i, i# a, T

2 d" ~' q# C0 s! c2 R, W    "eip158Block":0
. |) g6 V% M+ O* \1 v" s1 A' s
3 n" P% n$ ~1 x6 Q! U    }
" D+ o5 f2 K9 H+ J$ [4 w: e( j/ r- q0 X' `  A; K
    }; h; ]3 l5 ~( y7 F) k$ q

. Y3 O" O* Q; z, `    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
1 O1 K8 s  V2 ^2 d
$ _$ n# a2 M; e/ D0 j5 I    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。) J# Z4 I$ E& h! I

  E* o' S1 ]* C+ X. X9 a7 A& e    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。
0 l; U, V6 }% W  @  w) S  w  h
: g4 b9 U5 p! K: M. g2 G. I    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
# N7 X3 R8 A4 ?3 g
% u( F  E" h7 @" M, l9 l    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):7 B2 @, W6 t5 I( g1 u; S4 y/ e) r+ M0 o

# q- s9 f5 h/ X/ u    geth--datadir=./chaindata/init./genesis.json* H4 z5 m) a0 ?8 T
1 p+ r8 S6 L0 A
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
6 {0 w8 @8 R8 r- k- J7 u, q0 N9 t5 z
9 M5 c  g5 |2 h6 U/ w+ a; D  p    接下来,我们使用以下命令启动geth:
! ]& {% @% V9 ^: Y" Q# l! u6 H' Y& j
5 \, m5 a6 I" @; F) ?+ J  R    geth--datadir=./chaindata/--rpc) \; q: J+ B; U8 Z0 h+ z0 d

7 C' X9 e2 N: _1 x5 t    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
: F, N- ^; `. X( O  H% Y, \  H/ V& m% L
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
& m! J- g* l3 R2 ?
& a8 I9 c6 G, \/ u: \    mist–rpchttp://127.0.0.1:8545
' v7 U2 ?" r2 J4 K) I# z6 T& r  n
( n8 a# q( Q; c$ J# X) d# S, I    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
8 R3 O3 C* p- L+ ~* S
4 s& [/ Y' ?4 j    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:$ j# M; A( l! C

2 Z9 e* r& s3 j! Y5 W. I    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
* ?  P- P8 h/ e7 u- P/ ]$ ]" m. ^0 {: z
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
# K4 z; S2 y( g3 e* L8 e+ a4 e7 y) g. F( l: @
    打开一个新的命令行界面并运行以下命令:
/ C; o3 n3 H" S0 X$ m0 O1 H& e: g1 K- ?. C
    gethattach/ t* C/ c' c5 O3 u' L  @8 z3 `6 }

: O! m2 z" [5 V2 E    它会运行geth的控制台,现在我们可以与它进行交互。
4 B2 C2 g; A2 M
4 D( A2 F# b9 n6 l; Q- R( O    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:* g( |( E& K2 {* j0 \: ~4 s* ^/ A
/ t+ q) ~, g& S( ^" [# q; p
    miner.start(). N" L/ @5 n$ @* X8 J0 \4 Z6 Q2 N
9 y) E6 k- l6 o. T# Q& l2 z
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。1 O3 Z% o$ m4 ]* T
" P& ^' f9 S8 ^4 B/ I$ ?4 x
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
6 o& p6 a+ ~$ `; B
5 q1 k) x1 T  z5 O: q7 h    现在,再次打开“truffle-config.js”文件,像这样修改它:# g* j( ]5 h" [+ Y7 @5 r; @# {
- q3 H& {, H; l2 T+ t+ O' t
    module.exports={
3 L5 U" b: H3 [6 E! I. V/ U' f5 w  M/ q) ?, j+ w
    //See( F8 Y( ?# j4 _1 n. D

- `& G9 |( s$ h9 T- h8 y6 h    //formoreaboutcustomizingyourTruffleconfiguration!! }1 e* c  W  b0 o

+ K" P! Z5 u$ U, E, u$ R/ F; M    networks:{3 \# H3 P. P" }
. }" v! i7 I5 K* d  A
    development:{8 r, Q; B7 d. r: T9 u
2 j* S; a  W+ W: `0 @5 C$ X
    host:"127.0.0.1",
8 @2 u. t$ V6 s( E% l  g8 n
: i& W& O, _1 m* ^+ t9 Y" r( T    port:7545,
6 ^+ O& {+ h: M/ g' t/ z4 U2 z' r5 T1 S8 `, w" f! S8 P2 b& o
    network_id:"*"# W2 p7 v" A/ T  I7 d
; ]2 x  Q# J  G8 [, o
    },
9 O% A5 A2 e, D& Q' Q
/ Y$ S7 B) m$ l+ B    ourTestNet:{
! H2 i7 z. X. y: a" F& n& r8 P
6 P$ L1 }- M2 y4 \    host:"127.0.0.1",9 a# o5 q' h6 G9 B
& y! m8 J0 C! i
    port:8545,
2 u) y+ L  P9 u) {1 S3 E6 m! A8 j% k- r  J. f
    network_id:"*". k/ h6 [/ l5 G; N+ ]. H7 G

9 Q3 K- [- u' M- V. E' c9 |+ K    }
2 r' p( G, {/ M' f# r
* L( o2 s5 n' c$ G& k/ R3 q  o    }
+ w/ t4 i, J& y& R6 v7 F! l
% w: C3 F5 c4 W2 P2 G* @& @+ K    };
( {8 c3 F0 M3 d1 ]9 O) j; x
6 R# w$ Y$ Q( t$ ?8 A2 z. O# [5 }    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。% W3 V; r9 N9 Q, s3 W

5 T- `: O! }8 U    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:' J+ y% }5 _3 k5 D- }

+ A) A# ~; h& f) ?5 t! K    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
0 D  u/ M$ F6 Y' m; k4 i4 O0 Z
( p* g9 n9 I' y+ ]0 G: J    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。, K6 p3 k/ P! B
1 U6 a1 {; s) z8 z
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
& G# t4 q& g- I& B2 ]1 I: w% E. Y0 P/ S) B+ B' s2 M
    trufflemigrate--networkourTestNet
: e3 k( V" k) f
% k  `8 c. e& O- x; b    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:# [- z3 R  t  p( I/ F1 H, @
8 L2 J  {$ M/ q: E* ^  I6 P7 F
    现在,运行以下命令启动Truffle控制台:
1 `: z+ p, h# g# d/ u8 {  L3 I' s( J; n/ u% A
    truffleconsole--networkourTestNet" M; v+ I% ~. o
" ^+ T5 Z, ^, {; N
    然后运行这两个命令:" v1 `( q0 ?# y" {- C0 H. o' Z
8 m) c# f$ n/ I8 P
    Wrestling.address
  W% d5 ?1 z3 F1 x5 `; v6 d  ~0 u3 P. U1 G: u
    JSON.stringify(Wrestling.abi)
/ Q5 n  F1 `. u7 T7 `1 m# p6 t9 j% ^2 ~! [  z6 J
    你会看到这样的输出:
! F% E& Y9 d3 i6 t' a) p% y. s- R, g9 l' ^5 V. g
    第一行返回已部署的Wresting合约实例的地址。4 }; u$ P4 T- ^$ g
% I8 s1 h* D2 g5 N2 g# {
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。
$ d" [9 B4 e- X, F( h9 U  K9 }6 h& |
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
/ Y8 v0 S! M9 D
) r3 v1 |. B6 a    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。. Y0 p1 ~( Z3 O; E  Q) U
. ~) E/ q; r0 }3 y$ Q0 n/ c
    然后,复制之前部署的Wrestling合约的地址和ABI:
  U6 i' B- R& @) O- w# E. C
9 T8 H' }. p5 P" `  m  d! [' k    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:  M3 F  ]2 K; q) v+ d

3 T6 v0 C( L4 E* ^  ^! \    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。% \) x, R& C5 G4 j
3 j( J( y$ w% O: J6 f% S
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。
- i; A2 x: ]5 G% K% w8 M6 B: }9 U. X1 l3 {
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。8 S! _- `, l- h+ a/ `/ W

! f3 g$ ]5 F0 k( A5 `6 f" V    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
9 |/ w# }: g  K* P! J+ ^3 ^. Q/ R% \/ s6 M1 X- i$ b) J
    本教程的资源库可以在这里找到:
, u6 b. Z0 e9 n- \, Y& ~% n& \6 R& r/ N: L2 _; `0 ^
    devzl/ethereum-walkthrough-2( t: Y* y8 z9 k4 N, A

9 o# C! L$ i1 V8 `    总结
. e# V; d2 `6 `' \+ y- r' B2 ?6 x0 J/ r0 X- ]% }
    我们已经学习了4种开发和部署智能合约的方法:: \* f0 D4 Z0 Z8 \& l
7 q7 B+ z2 e  P1 q% V
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。) e) t" @9 [2 }

$ l+ _& J  }* X$ I9 u    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
/ n& B, ?$ _. \8 S4 N  W& @/ A+ d( C9 L8 `% C" Y; v1 W2 [7 R. M
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
$ U# w9 [7 U! g8 A) i
5 `1 n  q' j9 e! O- {. S$ ~2 s    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。$ A9 y  h4 I9 \* Q- Y4 L: [8 z
3 [; p/ Z$ n7 {3 o# f# U* B: m
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13