Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
+ y/ e" U4 v- F/ K2 |' Q
9 Q0 Y0 J2 T3 ~# q3 S  K- a    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。& {) Y9 `' k0 M( M% ^5 _' A
  D/ G9 T# b6 Z( G
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
6 {* i+ `: w5 g0 p8 g& w* t- ?# ~9 `0 @
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
' R8 Z  H4 h; [9 k  g
7 G: q$ r9 P4 A7 o, J* F4 D    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
& M+ G6 W& r0 _8 u3 P
* n8 f; o& L3 G$ l    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。$ Q/ W% a8 M) L9 m* X  H5 p/ c

* N% D) f9 z% l' U2 w    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。' I' H: b  o8 m7 [, w7 M! j3 _4 |
3 _: G) i) m/ ^$ l& R
    安装
+ @* E. L6 T' j! {7 L4 C  I; L) q& M
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
$ b4 M. s/ X1 t) j+ }. }3 ]& K1 @! Y9 e# i0 N6 S
    Truffle
: o: V. \9 n' P8 g
8 t+ R- [6 G. m6 ]7 L, o( _    打开命令行,并输入:/ p0 A+ R1 G8 c: d; \

8 G- H* q3 M8 w8 d, t2 P8 v) G9 p    npminstall-gtruffle
! Z% h6 \1 G7 n
' z; r+ r. L! i0 L9 _' o# f    如果出现错误,建议你多阅读有关Truffle的文档。
) B. H0 t, N/ H, c9 D1 h/ }$ Q2 \3 d5 ]
    Ganache# t  U' W- Q$ Q7 K) t5 r" P" F7 d

9 ]4 l$ _& I! Q) G# a& t, k5 n9 M    然后,安装Ganache的命令行界面:1 ^8 n7 m# z* b1 u( y( [

& @9 V: K! a  X- z5 r" w* v! F    npminstall-gganache-cli
/ Z+ U9 M: |4 w* L2 H6 E7 U: x' j8 k+ i
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
" w1 O; @5 k4 @$ f  u: T5 B; x- r/ V
    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。
8 M7 C7 T2 Z- E, y- ]# b6 r
% _4 C- U% o2 ^# L( k. W( [6 W% ]    开始吧
1 R0 M, H$ }/ C1 E' H0 k- M! Z/ p) C, D, k7 a, W# e$ f
    首先,创建一个新的文件夹,并输入。
! r- t" e5 y/ W( u4 B
  y3 s3 n0 x" a7 v) A    truffleinit. V. j  b0 B0 O8 @" f+ j) {* V3 s6 X# `
8 a3 W* {" b1 {
    它会初始化一个空的truffle项目。1 d/ \: @7 Q2 {) n- X2 Z4 m

9 T) V7 e& ^- q    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。. I% A9 [( b3 h
# u, S+ X5 P6 H# C6 }2 ~2 _
    将下面的代码粘贴到里面,然后保存。
! o/ r$ H: b: A- T$ Q9 f* `5 q* Y$ F4 M, W8 E" C+ W" J) k' q
    constWrestling=artifacts.require("./Wrestling.sol")* h$ [2 o/ [( l9 ?6 w$ D0 k

- H3 C  X! _' X8 t. H2 C    module.exports=function(deployer){
  h3 R# m) q+ j2 ~% c: X) p; g% {$ B# L: ?
    deployer.deploy(Wrestling);
3 s# e8 l  p, f8 G/ v* z3 Y# \7 M9 }, H. j- z
    };
* T) f- ^) Y* H  \, Z! U
. m2 p: O+ G6 d2 o    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
6 G5 h1 _- D! \- P' D9 y* {- `7 L) Q. _5 h; a5 L
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。8 G# r/ R3 M  y) h7 K8 ]

, @: ]* a% G/ S* |& W) F  O    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:2 p  w' ?( A: {6 j) ~6 V

9 H. z9 ^/ H6 w" z9 n% m    module.exports={# I9 n3 B. o$ g! D8 V
$ E% Q4 j: E: h5 F& Y4 \
    //See
8 S: ^9 e8 P$ `2 i2 R0 j3 ^$ A( A5 a+ Y  L) N. }7 m
    //formoreaboutcustomizingyourTruffleconfiguration!
1 a7 e" W5 n4 k+ |! ?
) Q2 _8 u( @, \) _# R    networks:{$ u3 A4 m  c" L

, w/ t8 R( l* _( N( z    development:{
1 U  i, K& R$ Q9 y7 y& H$ s/ C
4 L4 ~* z/ \/ q    host:"127.0.0.1",
7 h' r/ `7 Z& ]9 s
! U! _: w, }5 o9 b& [. m' J/ k    port:7545,, U9 R5 X. B0 H) E- o

: @$ e4 `. F4 O+ r3 j) y    network_id:"*"//Matchanynetworkid
. Y8 j, T3 ]' q$ s# L. d
" U+ n2 q% E: a9 m0 W    }$ Y5 X$ p6 m) d$ ]- B  x5 ?" q

" X0 Q$ R6 h  m' T    }
! u3 _, e6 [; b2 @8 ]+ M: z: E( z$ g2 a6 ^$ _0 V
    };, l; S) e' T) ?/ ]0 c# O
, o5 n3 @9 }, G: I
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。8 p) c2 S  J7 M( D/ k* t

' g/ k1 T& t5 n) Z& t    现在我们准备在区块链上测试代码啦!+ A+ x' v$ I% V

" o3 c' O6 h2 j, L) _: h% Y& Z    测试我们的代码* b- O; D- o/ ~/ P3 p- C/ B
. I* b" k7 W: ]% g
    在第一部分,我们会使用Ganache。, i* E5 M  K8 E* @& }8 e/ `# ?/ M

. E$ H3 w& [0 b# P/ X5 M% U/ C    启动一个新的命令行,并输入以下命令:) S; L6 K0 L. ~0 D2 r
2 T% P4 |! C- L
    ganache-cli-p75455 d  `. X2 N% W9 \2 F, e
) K+ Q( P. Q: {9 h& Z2 C
    它所做的,就是告诉ganache-cli从端口7545启动。0 y4 @7 W7 J; X5 [8 D

. ?  e: g8 T7 T2 Y. s. n7 ~    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
$ ]$ u6 R) l( ~+ w4 D0 k" C/ s' P8 n4 L0 d3 W) @% h" p! @
    现在,回到我们的第一个命令行界面,执行两个命令:
8 J* I) x. t; h3 w$ s& }( }2 |3 U! I/ ]5 x; w5 F! H0 C
    trufflecompile
6 v4 T' a4 z5 S5 N3 x$ h5 ?% p% z5 X! O5 o
    trufflemigrate--networkdevelopment
9 O+ Y3 K) M, |6 \+ |+ b' g' w
) V5 S0 p' l; p# }' T    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。) B( ]  G6 j+ l  M5 R) q1 p* T

- X: `* S0 X' g4 j* f2 t    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。; ~! k" V6 f# o" e1 J/ @0 w" X" p

+ ?1 H/ ]( q& R" F8 X    现在,如果一切都按照预期进行,你应该会在终端上看到:; r4 I' N9 k: r. i" Y6 g! q
2 V0 Q1 u' I& D/ }% V/ v
    注意,这里显示了实例化的Wrestling合约的地址。
% P1 i  h! }, q0 R: ^! |0 B  C2 @9 G4 I
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:$ [; a1 i% z9 E
3 D+ T. j$ s5 P( @  d8 ~$ j
    注意,它显示了实例化的Wrestling合约的地址。
+ M  ]- g) y. g& g1 m1 U4 e/ \) O; v. V! T* e
    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
. ]$ y2 ^" Y& e8 I8 D3 P9 u7 d$ N  q, i
    truffleconsole--networkdevelopment* g2 t- I* t4 [: l

- ?, r2 K6 P. z2 {. c9 ?+ R. |    首先,我们会执行这个命令:
2 N% L7 p8 d& L2 k. {- o% s+ ?3 R7 J2 d; z' j; G( D
    account0=web3.eth.accounts[0]
$ ~& [  t/ I  ~4 o5 Y2 d( K
5 e. u" d6 j+ a9 ^7 }* `. `    account1=web3.eth.accounts[1]
$ q5 T! Y" d# S: @. W+ c( {4 c* o5 k8 f% D" u0 A9 f3 }
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
7 t: s% N! t0 l% Y/ E  L! H
+ `3 c5 w% x2 L2 M" H6 U( `) f* A5 {    然后我们输入:
0 w$ t6 `0 W7 a- o
  {+ @" O" N" f$ t& y    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})
& N6 E2 b* O( \
+ x% e! h9 ^6 B- g* n    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
) G$ {, y1 s9 D  P4 ~/ t$ Q7 P( h1 m) g5 I: }' p# C1 r
    执行下一行:
; R! y9 P# y4 b8 M- f
5 x- o- \& Y+ [    WrestlingInstance.wrestler1.call()
" J" v/ q" F" E6 n) p; k' N. Q0 |$ f  V
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。9 _& j. ~. h' _  W9 o$ e: x

3 T, Y- i8 i  V5 I! g& p2 o. ^    然后我们把第二个账户注册为一个对手:  @" g: q; t& g2 U/ w/ V/ k2 j3 q
2 O; i1 N. d2 Z- J/ C+ H
    WrestlingInstance.registerAsAnOpponent({from:account1})* P, y3 l9 P5 ^; ^8 b) W. Z
! L7 f1 ^- x' Z( k( g# g5 N
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。
- p; y) [, I: Z* E3 J; ?; C( e% w# Y- n% P" {1 l6 d
    在执行这一行之后,它应该会返回类似的内容:
, C3 d9 \# n6 i6 Y9 o" r6 y
0 B! [- |  r+ W2 `- O    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。. Z- y1 @' x* o+ U) c
; `* b( N# x! X' _- M  O  j  V
    你可以通过执行下列代码来检索第二位参与者的地址:1 S* v7 H. S! b. Y
  z4 g, p8 L8 y; T
    WrestlingInstance.wrestler2.call()
: ]3 b* v+ [: ?6 O4 R& R% g* x  ]" x: I/ t% m& u
    现在,玩家们可以开始角力了:8 N% a; N6 H1 y5 _
: G8 s7 ^4 ]- U2 G. J
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})0 ]3 K" d# B( M% d
9 h' a0 o6 V. \: f: @9 `
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")}); K! K# h6 _! ?$ R+ \" e

  F% i; b2 \7 _7 B- q& @    //Endofthefirstround( _* M: ~/ g  y6 u9 v3 M) w* V
; V5 N- @: D' \9 ?. j  X' Z, g
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})0 m) O2 g$ z. r7 [: x% H

$ ]' d. A, ]6 A6 r    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
. u. Q/ i& o  F# f% e5 S5 f4 S! f  V! ^" {; C" N- Q+ _$ P
    //Endofthewrestling. z6 `) I" w) \( M5 x5 C  ~
% r7 q, e- @9 z: r2 |
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
9 K9 r3 t7 A( C8 ]) M* }- A& z+ Z, H$ D- r+ f
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。
) }* {" K: x# w4 Q& v, X
+ e  ^9 I3 [  ]; g# X+ M% ^6 ]1 F. }3 m    给你留个小练习:从合约中提取以太币。
* \# g. a) X7 s4 Q( \
0 c$ `' }; G/ d2 t# q# ?    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。2 {3 b% F" G2 c
. p& H! \/ ~; A9 ^6 z( U! S! Y0 c
    geth如何在这个过程中发挥作用) V- |9 B( M& a
' Q! S' x6 r7 {7 O- z2 z
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。6 h5 ?& t) @5 F4 D" k

. a. D/ Z" J* w4 D: s- S  s    安装
5 E: }* [! z3 c& }' c' R$ d+ [" l5 ]& g$ {; z
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。, o) K4 T' H, ~) ]" g; ]+ a) e
5 k& J6 a; @1 r+ I$ u) H
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。& Q0 m- T" Z" P/ W& g

/ h7 v7 r! O) A    创建本地私有测试网络
- W3 V6 f9 s. g9 @4 _. p0 \+ k- B* W) E) a. M6 @- o1 U6 A6 m
    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
3 c: f1 N0 A9 m# [1 u; \) s: E' E) S7 N5 U  {" {
    {
9 S0 z  W" c. C5 `; p! x% r# }$ ~) A
    "difficulty":"0x20000",
9 {8 R  [5 B8 w% o# M) c& I; ]
/ y/ `: t" C: u0 k* z2 \    "extraData":"",9 S' K9 V9 t5 \8 ?- v

3 j7 V# ?, S2 N5 H# i    "gasLimit":"0x8000000",# L) k% u9 M. P" g. x7 D4 I& [
+ {! p" M# V% b
    "alloc":{},$ b6 a% b+ G3 z3 x- i

1 I. n  P, ]5 |! J1 W; G    "config":{0 F& @$ n! q) s' b9 g2 V

" [9 F) W9 C' j5 C  t5 }    "chainId":15,
6 ]& ?! ^' c; N8 Q2 C
' ], X. ?3 f2 j    "homesteadBlock":0,% K+ t3 a# T+ {8 M7 j4 i3 E
& Q. g2 Z6 o* f
    "eip155Block":0,
& B2 m# q6 d! i2 l& f4 @
' d2 Y- [. m& a, i# f% r) o    "eip158Block":0
; G' D9 v! H1 L1 t4 c$ ]4 K. J4 z- ^" [, f4 X
    }
" D2 I2 f2 u% b2 U8 b* Y" E" e4 r, a$ Y2 x0 k% k
    }
8 U5 o( D! [" D8 B( c& K
: |0 o( D  g* n, [/ A    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
9 T2 j+ I( i9 ~9 b4 O+ M$ y" f, K/ g- u. e1 o% m
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。
2 T+ N% `, q9 Y) P
$ p0 |- e! u6 m: E    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。7 V$ @5 `" z3 V' J6 Q  b9 ?

" h* W7 B7 W6 t* r/ Q8 g  }3 U' Z- Z    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
; y+ d; {0 T( Z$ X, S; }: p
/ O5 h; d; p: c. r9 P* F3 w    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):/ V1 u6 q, O6 ?7 P6 G2 [) t! a

% J2 f$ U6 p( C! p4 }6 E2 [. t    geth--datadir=./chaindata/init./genesis.json
+ @0 h3 J; g( s0 ^) Z9 U$ p6 [/ R4 y
4 K$ N1 E( ?; T    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
; V% v+ ?3 ?! E' b8 E% u1 B$ A& n+ p; P3 r1 ~- {
    接下来,我们使用以下命令启动geth:
$ m6 b  |& Q- K6 U+ E4 v
1 v7 i9 ]! @8 |; Q4 b5 c. m    geth--datadir=./chaindata/--rpc2 F0 @; w; j+ v$ p& \5 ~

7 ]: J; y) H6 I4 `    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。! O; Y6 _7 ?4 H3 C
% m1 n: l: h+ o% _3 `
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
) b6 Y7 b+ y$ _( ]+ E; y. }# l& n1 e) `4 _" {  A
    mist–rpchttp://127.0.0.1:8545
6 w' x" P) x# x
6 p$ q, S: z! k2 p/ C    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。1 P+ w5 h6 J! q! O# U% x$ n2 U2 [

6 @  ]9 |; M( g7 @! ^$ s  U    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:+ X- w6 e# f1 C% N

2 V% }2 p% U) G$ \7 X; x. ?    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
$ C; T* W+ [. f/ ~. W! k5 ]6 D
% U' n6 d6 e4 K    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。' h: _# h, C3 Y: t% ]9 q
3 h" v2 L4 A0 p, t
    打开一个新的命令行界面并运行以下命令:$ g7 l7 A  a* q  J1 \

' W$ V3 ]! r4 ~% _9 h# ]    gethattach( Q2 X) t* F  K2 Q/ Q

2 @/ p  E  W, T$ `& [0 `  N    它会运行geth的控制台,现在我们可以与它进行交互。5 s6 D$ x& F3 Q- m, u  B. f; w1 q

8 ]! |% O6 }) X' x    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:5 E$ j* b4 i4 B3 u$ D# u8 I3 `

; T' ~  |. m2 q" E# p    miner.start()
2 v0 J7 G: V0 S( t4 N. k0 R1 F4 t% H% l% E3 D
$ `. _; }% r+ N! H  c/ V    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。) n2 n, ?% p; }
% P9 G, J0 D" {
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。3 M1 z/ L' I) G4 [, {9 t0 @

7 v4 G; {, u! `3 k0 H& x( {) y    现在,再次打开“truffle-config.js”文件,像这样修改它:
+ ^6 [& ?' Y+ t# R' e( c4 l% |+ F# c
    module.exports={( G$ |& u/ ^7 ~; A

: w2 V' B* T3 u    //See6 P4 X" l* b% s4 a7 P: N% N7 j
% T; F* n4 \+ X9 \  v) i
    //formoreaboutcustomizingyourTruffleconfiguration!! \' N. Y( L, \; N8 i

, H0 f# @$ T4 L: B# V/ n    networks:{1 n( X, Y- R, X0 j/ G  y( @& {6 ]

$ m2 z& n1 J; H5 J7 w    development:{
( O: |  s! g  V9 w$ l3 n& G
/ ~: s& Z0 O3 i6 b6 j1 m    host:"127.0.0.1",
. h; x2 |# \& u. k! q1 J  T6 u4 z4 n
    port:7545,* {1 S4 G3 R/ K$ `$ d7 U4 ~3 e2 J

8 ~. i8 Q, y: W4 H/ |( o6 l; H1 d4 u, w3 i    network_id:"*"
" Y# w1 J1 P9 a$ T: Y3 I
0 B6 s: A' Z4 N4 M( q. N    },* ^+ X7 u% \, i7 x. q

6 m# L9 d  R, a! {    ourTestNet:{$ d4 j. n6 v7 X0 G" B5 h5 g/ y  P

2 A7 }2 Q" Z7 f) f2 u. T( H1 Z5 m    host:"127.0.0.1",
9 h$ c4 o! M/ q
5 c' J, `0 X" ?; h- n2 S    port:8545,6 d, s: G: I; [5 |

( C! l/ p6 N* u% w5 P) [; h( s    network_id:"*"6 L! k3 f* d) _; V; o
+ B! p* O- i& o( c) D9 c. c8 |
    }/ b2 o; {# U/ m3 ~

3 ~* {7 [# U0 r+ p    }
$ s1 W1 {7 ?8 J" o6 A
8 ^% i" K# I4 D" r9 f    };, j# ~) [3 z4 O& ~; _% X& s0 i% Q

$ x3 a1 m8 Y; g" a    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。
6 x* M- r# K4 n& f% I3 V6 W
: u& w7 L# k% d% u  B7 l7 f; ~    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
6 u6 B" D: }3 D, j$ _/ ^- P: U6 s, R( i2 a
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
) V* Z+ M- j% t6 j% }  m- F5 V) n% w# p' V% N
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。- @2 i. x- ?% E+ u" m
& {1 o$ U% o( }3 L
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:/ J' M9 y9 }( W( v  J$ b, a

( V+ E6 G0 E* Z1 Z! d3 c3 Q- |* S    trufflemigrate--networkourTestNet
- e5 z+ v6 H7 G, q5 }8 F
& t3 g( P6 V/ o) h; P  i" `, |    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:: v% p+ d6 y7 g8 K
8 B! M( U/ J# W) @
    现在,运行以下命令启动Truffle控制台:: x" ?6 l8 T" R

6 n- e; W! t8 ?  A5 n    truffleconsole--networkourTestNet' o! O$ t, f. f+ h1 v
) Z$ y0 E; V7 ]3 `/ n# v3 A
    然后运行这两个命令:, n1 h! f# ~& _4 W

0 q# P9 C% z. `% Q& ^    Wrestling.address
' k$ x$ C& }* \3 i% ]; [& ^* l9 _7 K: {, O
    JSON.stringify(Wrestling.abi)
; x% {! g7 m/ t/ I* f  x( U) y8 E
8 H7 u2 F' U' S4 ]    你会看到这样的输出:
" w# B7 U8 v  M0 t; H" F
4 k+ `6 U) ?5 g8 G1 @8 T# `    第一行返回已部署的Wresting合约实例的地址。
$ H* u+ M. I( p$ y; [/ B* d9 l: M% n3 V/ W' i
    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。& ?  R: X; Z9 r" t
$ s! g7 u4 Y, ]+ p! j0 V, p1 f
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
0 ]8 }: w9 a2 z! K& P; v7 ]6 v# w7 V0 D9 e
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
7 j# ]4 T) s4 v- q% z8 d2 B, d8 j, A5 L
    然后,复制之前部署的Wrestling合约的地址和ABI:- v2 V" x) R7 @
; [; U  P( D( B: d
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:1 v; n' D$ [; ?4 a
( i% J) W+ H/ Y/ ^5 ^  z
    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
& \7 `- }& H4 t9 e4 [. c0 a4 c6 F
% g8 {1 ~1 t0 B/ c    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。
6 ^* p- F/ R6 O& J3 W, A" O
7 e" I3 B* B$ ]) n# z; M- M6 Y    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。; |/ \# Y- T0 c% `% S9 l# t

' _( t( ]" T  N  U    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
6 m: j5 v, X: j! B3 m" s; A8 W. x7 u; C6 d% U
    本教程的资源库可以在这里找到:. I4 w" s" b4 K, f

! k! d7 i* j. C# B: b+ `$ z" e. q    devzl/ethereum-walkthrough-2
5 ~+ y( t  |6 Z$ X" i
0 ?- o3 u/ Y/ g/ v7 R/ d    总结% P; J# H; u6 i) C% Q3 m
/ X" R( d5 ]+ ?/ |& L! L
    我们已经学习了4种开发和部署智能合约的方法:
9 D& @& J' q' V7 c+ U( u, Y$ r- H9 O3 P8 s# A/ A( q
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。0 ~/ E: w( K/ G/ E
- X0 C+ C6 a8 Z& W% h0 F
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。# t+ s0 V0 ]7 f; z" C! _

2 {+ W0 |. P% B) N9 N    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。+ X. Z) v" Y2 W4 S, @) f+ F; D6 m$ z
! h# [  E2 s& [" f2 G& ?
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。- w% ]8 D/ M1 J$ H9 z5 V$ n8 }5 T
9 {* d3 I" P+ l) h" D
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13