Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:* g6 X. {! I" W) M  z- \
- _( {8 ^6 q, P! F$ X1 Q
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。
# {2 C( v4 q& ^% t- [/ b/ q! x  @" K+ i/ g" z. n" k
    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。3 T2 a, H" Y1 n) B
7 M. G" J' \& z, R3 c
    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
/ a+ N) E, O$ h! S
* V6 v6 b, N. L  a9 f    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。
. s! y7 z, M% ]* }7 {* w
8 P. b2 C$ F& P. ?    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。9 `, \/ G+ V) M, U/ p
0 B: j5 r6 W9 _
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
' A& }- p+ Y, v- |1 S; D5 y3 g  [2 j- z, z- M, f
    安装
3 c& C8 a) h. d" U- x* |# l. M) t
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。9 M  A# H9 K: a, G  m
& u; [3 D4 D5 v7 t0 J; P. n$ A
    Truffle: ]# G3 {% \0 e5 x
' @9 B( q. j8 C
    打开命令行,并输入:
+ M+ d/ k+ z" |3 T- |7 s7 H0 V8 m
    npminstall-gtruffle
2 s! Z% V! h" [  W
  x) ~  {6 f# a5 r    如果出现错误,建议你多阅读有关Truffle的文档。+ x7 [, X( Q3 c; P9 z# z
6 r1 B7 h' L# ]7 C$ x9 L8 g8 p6 E( `  [
    Ganache" J4 A  O" E' C1 e$ H+ Z3 ^
, }* A1 o/ @$ g- }
    然后,安装Ganache的命令行界面:
, {7 Y6 P) K7 ^$ S! z8 ~2 g* V  n2 e; M. c& ^& y
    npminstall-gganache-cli( i! F/ _* S- w1 a
$ ~/ n& t; |8 p6 R8 Y* I2 t- p/ M
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
& Q% C0 O$ i: q9 C5 C5 t! C: v
" V5 F2 z( \$ u+ w6 a- h# y7 `    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。2 V3 t+ e  T- h; z' r
: T% ]3 z0 _+ A4 B
    开始吧5 F. z; g' x, |! h8 m* Q

! x" b- D* |6 w# y1 L$ _    首先,创建一个新的文件夹,并输入。2 {( x& ?+ G' p' z

  q7 [3 _8 ?' }8 c: O5 ^% Y    truffleinit
& }& [* P( N$ m4 T, j3 e! M8 p8 h7 [2 s- q& ?, \4 q, p8 E
    它会初始化一个空的truffle项目。
2 Q+ f, o4 u+ w
! d) `1 t; j# w4 ~- r    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。6 A8 O9 ~2 M- u$ i8 k9 [
/ M) v$ n' W0 w) R; }/ c* ~
    将下面的代码粘贴到里面,然后保存。8 w7 w  {$ K* @& k' v  C3 [9 v

0 J0 k$ Q) u. s2 z    constWrestling=artifacts.require("./Wrestling.sol")8 \9 ~& P. U- U9 k; g' _2 O

7 B) p% ?" ?; L8 F3 T: m    module.exports=function(deployer){
# a6 ^. t3 v1 d9 [1 _6 t4 ]7 U8 \
) r" y* c8 q3 Y+ V2 y4 m    deployer.deploy(Wrestling);3 n- |9 m) |. Q/ X$ P( F3 C& K; x

+ d) o8 Z8 _- z# V" K; U' {- t2 G    };1 s; o* Y, X) r2 R  C  e- r

) s' d3 F; b. [0 Y2 _    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
! J& e4 W1 w/ v; V/ t3 z9 e8 A3 Z0 t2 J  r- }
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。3 H6 q6 E9 _; \  j9 Z
* S5 @/ E: h$ z0 u' a
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:7 `5 n; A& N1 v- r# P$ ~4 a' C

2 ~! W2 j1 L& f8 P& s    module.exports={0 V% X9 {5 r) e0 q

+ v/ J; y, q3 L0 g  y0 L: N1 ]    //See
# {4 Q0 K% @8 E$ Q' j/ J
- a# E! f' P/ C! F* k    //formoreaboutcustomizingyourTruffleconfiguration!4 `' n' F2 l/ N7 o( A" E4 c" t/ I
9 M) H3 J9 I1 {6 h1 I
    networks:{1 W5 N' ^7 q; n' [5 o8 P# r
+ N5 V6 c# s* {! X1 `( c
    development:{4 C5 o6 G- P; L' [9 O& \, ]! S

8 y0 |4 f6 m; U, |" n, U    host:"127.0.0.1",
; C. [; [7 o+ m+ \
% W# s$ _$ z, j" o    port:7545,
3 E8 y- O3 }4 V7 B% o% Y9 z5 o' P4 h& f
    network_id:"*"//Matchanynetworkid
  U: X0 [3 n" J, H! Q( ~3 u
2 ^0 U1 p% R' o, x% C    }0 U1 X* W. W5 x$ ^# m/ o4 Y8 ^
8 v# n( Y; V6 n/ T4 H5 _  @
    }9 ?' n( M8 C1 k- q6 Q( W2 \) k* x
: }& J( ~5 S! ]' a
    };* `3 ~4 R* X; u$ a
# z8 s$ T  R8 Z. l" ~. e* M1 @
    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
# M, [+ o' I/ y9 m: C6 n
1 A8 M, c2 a; ~6 p- ^    现在我们准备在区块链上测试代码啦!# z: w3 |1 ~, D4 Q
# j: C5 b! m$ |1 j7 I
    测试我们的代码% E0 M  n. @& ]0 S; v$ J

8 x0 j% p0 o2 T* c    在第一部分,我们会使用Ganache。* A$ D3 H2 H$ t: i: R

* I$ {* [; @. e! T4 \+ h    启动一个新的命令行,并输入以下命令:
4 ?# n, a# e7 j& D9 t! \% ^, F8 z7 R3 {- f2 S+ l
    ganache-cli-p7545' z! z4 k/ M3 s, \0 r/ Q! H

& r0 n4 D" h: }7 h2 A. m/ t' J    它所做的,就是告诉ganache-cli从端口7545启动。/ B3 {$ q: f1 T
+ ~5 h3 w6 e* z9 i; ]& f- d7 v
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:4 Y! J0 X+ T9 U, T2 q; b$ _
0 t- t0 L6 T9 s; I
    现在,回到我们的第一个命令行界面,执行两个命令:2 S0 s2 }& n, U+ ]
7 g! L2 X  O& H& {  m# R
    trufflecompile
7 s; {- q3 y6 |% \
4 Q% d/ V" Q! T/ S5 Z% M    trufflemigrate--networkdevelopment  y4 ]& w, Y. W( A. \5 T8 d' l

) G$ M4 d2 ?* L$ ?% H! _( Z    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。+ `: N' o$ c$ j) n1 X4 x2 M

% i1 ~' V: x* ]  a0 J* P. W: a    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
5 ^. R$ S$ z6 T  e3 M
' ^. C* H' a) V    现在,如果一切都按照预期进行,你应该会在终端上看到:
6 D8 {% g# J9 t7 U: ]3 O* F+ r
% a$ y4 X. M5 ~, r' R  y5 ]    注意,这里显示了实例化的Wrestling合约的地址。
) E; s0 e7 K. t# g8 m) R% d6 R9 h- M' w: k" u0 l$ L8 Y
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:
% M$ z! t  i3 O
& a" E) Y! H: i/ V% ~/ k3 ^    注意,它显示了实例化的Wrestling合约的地址。4 `) b) C2 ~: `) P

1 ]) j  s! i5 c! Q( }+ Y+ h    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
& r, H& L+ m" }$ t) J
4 o% D3 @( t2 j! l' A) C" I    truffleconsole--networkdevelopment
$ p8 F! j. D/ E( z# i
2 T3 D: c8 Q8 Q+ V; j; h    首先,我们会执行这个命令:4 ~" a1 K9 G8 x( V" R% d4 m; Y5 ~7 `
+ _0 G' p2 ^. \! i% r
    account0=web3.eth.accounts[0]% _  z: w) {6 J+ l! M4 u
# I' l9 I! |! [! ]
    account1=web3.eth.accounts[1]
/ e( W7 A+ a* d+ B, f& E# A) R+ U* R1 _
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。* R6 y; ^" e; O5 h/ e/ U

- o# b' H4 l) {% B. h5 L0 {- l& N* X    然后我们输入:. x: J8 a: b7 h4 y

0 T# S) V4 W2 R$ ~( D    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})" t7 q6 Z6 c  a$ B# g6 o

+ \9 m0 m/ j3 N/ c    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
1 ~. w) P! ?: h3 k6 i0 L
3 @9 x/ k4 i" w7 ?  z    执行下一行:! `- z$ d3 j* g4 f0 v0 K4 O* A

7 B6 l7 c- ?) f+ `- X    WrestlingInstance.wrestler1.call()
& y8 t3 n; g' _2 ^/ |: C, Y6 [$ a9 o6 z+ Q! r5 ^2 a
    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
( Y* i7 M7 J1 f
6 T7 I3 B$ R/ k4 H    然后我们把第二个账户注册为一个对手:
6 \8 m( o- b1 K( @5 i3 V- `7 R0 e5 G1 U
    WrestlingInstance.registerAsAnOpponent({from:account1})% M: w: v: b, V
4 e4 v( g! B. l1 g- v
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。: T; m/ A  W. m% A* e" r
. F0 _+ S8 z: W. @4 T
    在执行这一行之后,它应该会返回类似的内容:/ n# l. [! B& V4 `9 N' W
$ Y  s; ]" }- I6 _2 }/ _4 R
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。- l9 Z9 H7 {; }- f8 V0 E/ g% t* `

, K, m0 g3 o5 l1 ]( d! Z0 l    你可以通过执行下列代码来检索第二位参与者的地址:
( p+ `( J: F! U. a( Q. B5 C2 f
$ E& x3 ~7 o- I% o; }0 g8 V) W: `4 r    WrestlingInstance.wrestler2.call()
1 \, M/ [. b8 r% q  s6 R' M% D8 U, C9 Y. ?* A# s; X
    现在,玩家们可以开始角力了:2 n7 S. N- n1 x

, t" _7 l* k/ `6 S* a    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})4 h2 ^  @$ t, {- w* G
6 Z6 N3 V. w; V/ l; E) I
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})7 o* @! c6 q& p7 j/ f+ F
6 k: Q3 V; F2 }! f3 w/ K9 s
    //Endofthefirstround
4 K7 v2 \% r1 M+ q8 V% v8 g9 R* Y1 i8 c
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
8 \; Z, y& t/ O4 [/ ^9 g" D4 k* d8 G/ z& ]; [" J1 K
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
' m) D- t# O8 D6 P. V+ Q9 e
, N+ E. x1 [' ^$ R9 w- a, q/ [  i7 `    //Endofthewrestling
' ~( x+ u" d2 N7 Y' ~3 {4 H* s! [% j/ |. ~- Z3 y2 g
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
/ X$ d3 O" {. ~: [" k/ N: Q, ?1 A; n. I! R& _4 x# {* J; j
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。
7 r4 O% w' `1 Z0 x4 K% c6 q
  |) T3 Y0 l+ d/ z/ ]- `( g    给你留个小练习:从合约中提取以太币。
6 W! a- o+ \5 T. ^$ ?
  g9 H7 @0 [* T$ D+ _8 u) `    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。3 A+ a& ~; F7 ?) ]: U, z
& I" S/ h  k* L9 z/ p+ m8 n) C
    geth如何在这个过程中发挥作用" A* L6 j/ h5 d, T

+ e; c, ~1 H9 i) l  g5 G0 L    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。
! Q( N% |  s. ^# k- s
2 Y8 O. m0 q- T0 [% u& c5 O. I: K    安装  Q  [+ ~  _  ]4 ^

7 c' V/ {, K% E9 a- D" s    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。
+ t6 z' _4 Y/ H
/ Y2 T8 ?6 y/ k6 U/ _    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
) h' x0 t" \. ]2 ?+ l- c+ I, h0 Y& b* J% p  v! ~! W$ o
    创建本地私有测试网络
% _6 {% @- }+ ~6 H8 m; R
7 I. g8 c4 H: O& G; z! h5 N4 W    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。5 T" N8 J$ A% y8 E/ K* s

7 E. k* D2 E' j, U6 A    {; W4 T, \% r6 S! Y; `" W/ B

, d7 j+ T) B: h7 l; p- Q    "difficulty":"0x20000",
" {3 ?# `/ i2 b! t+ p: Y' X% _
# R7 b* ^! D( X) Z! w! t    "extraData":"",
' O9 x3 t+ \: G4 P: _3 O5 U# l1 \+ T  U0 _5 q  G
    "gasLimit":"0x8000000",
' T8 k% i0 W7 o/ C: x, Q0 N0 c
8 t; E1 M, g2 U" O    "alloc":{},6 C0 e7 U# S; S: p# U
% s+ M5 `" e; P( C. Q9 B0 |- f
    "config":{0 E$ q$ |: I" \* x9 G3 b
3 e+ x+ j. ~/ W; `7 x& A
    "chainId":15,* V2 j  ^. @5 V  d
% `2 T& s( L+ ?3 L1 g" v
    "homesteadBlock":0,; W" ~4 K1 b& e& j  I  Z3 y& P

% i' \$ C. J2 B' Y+ C    "eip155Block":0,
) [; c1 Z5 d% Y8 J1 |7 v; z$ t
' B/ W( Y: K2 `; R' i0 }    "eip158Block":0; O2 j, O7 \- a- k

/ |7 k( Y: d1 T" [0 J    }
8 v4 ~: h. V  v+ v: R: I9 Z% f; ?' L4 @1 @3 }" d$ O; }3 y: R# D
    }
: B. W: A9 [! K9 w1 S4 a
4 f) U/ [* s1 |' o4 X    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。8 a3 c9 G+ x# F, f9 s' _& @
6 _! n: Z2 \2 u# B# K! c7 t
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。
) U# a6 x$ h: }7 r8 [$ |2 }$ _0 f3 M- ^, c! A2 r
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。3 @3 A) L5 }% @( V5 E
( U( |. w. n  t" d# S) V3 \
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。
. N4 u: S8 Y$ m4 `: C4 s
9 _6 _+ ]8 d9 a; [    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):
: X& q1 y+ Q8 X8 I7 _+ N8 l
; ?2 _, K3 r' W: ~- A6 [4 Q0 V    geth--datadir=./chaindata/init./genesis.json6 w$ Z; ?7 C. i( d$ b

1 ~7 Y: `$ p( y9 p% T* ~* `    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
: q0 l, @& B5 Y9 y. M  T! B! U9 b, {2 K- i. I
    接下来,我们使用以下命令启动geth:
% }; c+ D3 D) t9 G* B. e# `  m  v- E  ]- a0 n' b% x& N
    geth--datadir=./chaindata/--rpc
# y% J. E7 y* i4 W& n4 @1 _3 q& W4 `! R$ C/ D6 L8 i5 g) T
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
0 i) k0 v& c  r# s. W( E" a  [& r) l5 ^9 c% D7 m( i9 H
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
" D$ c" ~1 n: L! X: c% A, y) Q* E: b5 I! S, V% e3 \. l" c' S' k! L* s
    mist–rpchttp://127.0.0.1:8545( i# l8 u8 Q6 E# Z7 i
' [5 e5 a; M8 e3 b! x
    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
9 e2 b) ~& w, A% J+ \$ Q- }
0 @# W! i9 ]5 w+ d7 G    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:: H# @  E( J/ m9 Y/ Q% L
4 n* K/ y9 T+ Q" C" y
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。- Z) @4 e2 B; E9 A+ y- S
8 _1 _* `- h2 K+ L& r" M6 C
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
/ D; t2 r: F' F. h! e# y
8 m) A0 L: Q8 v# e% G/ }    打开一个新的命令行界面并运行以下命令:
% J) m$ B) t" m+ r% f9 N7 y5 w
% c/ d9 M/ E. `# _3 H6 _    gethattach
9 S& [+ E- d) b* p5 z& a) X7 I- ^: C' k  c+ ~# X& t
    它会运行geth的控制台,现在我们可以与它进行交互。
' j& i' B. w6 k$ ~8 O$ M: S5 M7 w  Y1 B4 e' v& `
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:5 w" |5 T7 Z. I8 w/ w2 @

  b. k0 @/ b- h1 I- O, }    miner.start()
- k" A, M4 K6 j; ?* s. w4 Q! @6 F! R: r0 ^  Y/ R$ R" `
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。7 D6 [/ U- ^4 {8 a& w. @

# E2 |3 H- G# t. d, H    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。! N  N% a9 _5 _2 U! h+ ~- m
: H# X( `8 a& v: L1 r
    现在,再次打开“truffle-config.js”文件,像这样修改它:( I( N' N5 _8 I6 F# h

- P! D  _$ Y, ?9 T    module.exports={
% ]2 y% l5 y0 v2 e! q
1 V4 Z! \0 O0 \7 k* D. i. D" E6 S    //See. y% {" u- ^6 r2 y' y

+ M( x( X$ N! j- b3 }    //formoreaboutcustomizingyourTruffleconfiguration!" H1 c+ ~4 @! Q# S# n+ B" g/ h

" g' S# c* ]) r) F/ |+ A    networks:{
4 b+ ^" I7 k0 A. {8 S6 v$ {# K( a
* {* r+ H* _7 d0 Q    development:{9 i5 P$ L8 k+ U% u

0 d! z3 y1 Q9 P, H* r    host:"127.0.0.1",. }8 V$ E$ Y9 y' K) \
0 n4 @# O6 I4 O% n& o! {1 _9 ~, J" Z
    port:7545,. a" w" q7 i  C, F

' |7 [# m( q4 H    network_id:"*"
7 k" V( N( S! k6 R( }8 g* |' P+ a8 l7 O( S
    },' {% k$ f$ m3 R9 [: O$ y# t; W* f

" o8 C+ \$ `, j( N# c. \    ourTestNet:{
, N' Z5 j8 x. G; v# y
- s; H1 m6 C! I2 h% H! ~0 z    host:"127.0.0.1",
( S& t  g: `" N9 r! Q9 u+ X; Z9 t" ?! T( Q% ~
    port:8545,' O9 w( c8 F" x+ i4 i; L

& O% A+ E6 E& d6 P9 Y    network_id:"*"
% D2 i3 A- f) j7 j8 [/ P
+ t% s2 r& B% @* x: T    }
/ X% B2 _) w) N5 P+ q6 k( Z6 ?; H3 K) o8 l1 r
    }! B8 r9 R+ `6 Y9 `4 q; P: Y
% v' q( u8 f: d9 [2 {  x. ?
    };
$ H$ l' U* r  k) p6 k; N3 T
+ j$ T4 Z( U5 W    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。) U& j3 \! Q4 w* E$ [1 M
* B! \; H4 E, T' p2 ?. M
    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:5 W5 Y4 r* F& ^1 D/ K9 b4 k4 _, A

6 _+ ], f) v+ I    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')+ g5 ~, H5 t2 T0 B1 l( ^3 R

( I- G8 P3 l2 O" `0 @0 M    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。
7 P8 k2 V2 _. s# P6 i* ~; q/ d2 N$ H2 R, m9 e! J6 q9 q
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:
- s0 t/ {6 T0 {% \. s' f( K. F5 D8 D
    trufflemigrate--networkourTestNet
% e* s/ H8 @: c+ b$ J
+ p0 S3 o5 h7 {' h1 z" P    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
- r! I, \$ m# h% V; Z8 M
" f4 ^) i" F. a  V7 R    现在,运行以下命令启动Truffle控制台:
6 Y. T8 w$ \3 h, i, _1 b. |  Y
6 P, n% @' n. I% H: ~# V. M9 [1 \    truffleconsole--networkourTestNet2 ^+ _6 @$ O* e

! r8 [8 {! O2 a' E8 L. e6 |    然后运行这两个命令:
6 ?# h, p( G$ {! V/ B
/ |- U+ G+ M# E! Q6 z+ K/ M9 C    Wrestling.address4 d9 q- h% D' I- H

3 v  M5 |+ O4 a7 s& u/ c    JSON.stringify(Wrestling.abi)- W, T' K+ \  C7 y) i
7 L; B5 u. Y# h% T
    你会看到这样的输出:, J/ k  u/ O- w( D# J8 m

' [" D3 I6 U& f- {    第一行返回已部署的Wresting合约实例的地址。
$ l- z& f  T4 V# n
* O& l" p" D( v9 V, U- m- K8 z2 C    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。- [3 `9 W+ X6 Z- e8 E/ W2 t

0 N4 H' A3 @. `    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。9 `  F9 D% p% H* \" I
" b5 a! z$ U. l2 t9 W
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。- O+ K; t" P' c

6 q9 }+ k% v5 t) x3 {) g% G; ]    然后,复制之前部署的Wrestling合约的地址和ABI:
% d9 M1 L8 D% [4 j2 L/ H
8 I' h3 d+ M' a    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:
7 ]( c# X( r/ t+ a6 ~7 r3 c
4 n# v  l" B, t# l  Q+ X" x    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
) @/ k; B/ U$ W; F' z% G" E/ N# m, d, ?
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。- f/ J& g8 b( g) K
/ z! F! G" ?  m1 q3 U5 l
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。) G! G/ c1 ?8 o! u/ E* g3 c. p0 |+ I
9 z! F% I9 E* p2 Z" r1 z
    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。% [* p  `  k" [8 y* ^

* P  ], `7 }+ E  `    本教程的资源库可以在这里找到:
8 M4 k1 J* j: v9 t: X  g5 o8 ?2 ]" U' W7 l: J- y8 u' \3 }; a, h
    devzl/ethereum-walkthrough-2
( a: _% o, P! a' g" k0 H* N, \+ o+ Y$ P/ [
    总结
2 U( Z# Y" q2 Y4 T9 G. a) K& `
, {; R1 P4 ]' F, B  T8 X    我们已经学习了4种开发和部署智能合约的方法:" A3 T) g* h6 r
& K  @8 ?) w6 F/ E0 M  G0 N
    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。* w6 s2 j* Q) z
5 C( H9 I6 v7 C5 u6 U; c- O
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
; _( Q3 }1 Z+ v) a
) G; o2 A$ a# F( V    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
! ^# f4 I+ R, ?/ F1 N, E! k, ^$ H; j* [# D* i/ r! }9 [, V7 Q; j3 S3 n5 ^
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。
; ?8 |8 @# z) j& C( W- p& B+ V0 r% X. L' C4 n: Y
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13