Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
4 }7 k& u( ]! C, M0 z' v) w# R& _4 E/ A4 Y+ _( O' @! n
    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。& G/ s! i+ f) a, G

1 m+ H3 a; M% G8 o7 o# s" X7 l    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
$ _* K/ S, z% [9 n: _: |2 |/ i
) X7 R' U. ~- }& [! Z# l    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。
( q: y& g$ x% b- g
  ]  s; L7 h/ v0 l% E( ?0 T    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。+ \8 b6 m! r" [$ p1 o. A( |

5 f8 h. n) [% n! `5 K    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。
- F/ A- w6 B0 _1 D) f% b0 J/ X; c; |! W2 t8 \9 J4 ~
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。! L) Y+ I; B3 V
6 z; C8 _& f" N
    安装
' ~8 `0 d! U* E0 r+ S' {2 t" S( K. [. f/ Q1 Y4 Q
    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
7 Q1 @* i' h& d$ a5 N6 L% p3 o! W& T& Z$ G
    Truffle
- _4 V6 [5 `. x8 c- b( y
/ W" b/ H8 r5 Y5 d, f* Y* k2 o    打开命令行,并输入:
* c4 i0 K* Q1 f7 J$ m
5 T1 m- Q5 ]3 t% P    npminstall-gtruffle/ g; {( I0 i" B; r) e/ u

  e- F" F" x% V& @* q3 v4 G    如果出现错误,建议你多阅读有关Truffle的文档。2 j& g# A! ^! v6 s
6 B* p/ q0 C3 j( _4 d) [9 F* Q3 b
    Ganache
5 o1 c5 l* Y& N% Y6 s, S( _* c% m2 n3 f; u0 H
    然后,安装Ganache的命令行界面:
7 z, X1 W/ b9 V3 d/ v  z4 B
$ ^) Q9 ~- p/ O$ G/ Y9 Y    npminstall-gganache-cli
2 A% O% v; s! u3 Q, _
1 P& l2 s6 U9 e+ ~5 d. \    如果你对此不是很确定,点击此处访问Ganache的Github页面。
* \( b( `' b& x8 e; {& n, a
- F& W% n+ W) t6 V: M- `$ x! f7 N) Y/ z    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。; d4 F3 G. z& Q! z
" _( ?& u. j$ _% b& A1 i8 A
    开始吧4 M) q; d2 h, P! m
- ^8 ~, `# g5 u
    首先,创建一个新的文件夹,并输入。! c8 M. m1 F$ \
9 l2 e( C. K3 P+ ?
    truffleinit3 l, D: |+ j. _/ B/ l

  b" @- P0 Z# z: p    它会初始化一个空的truffle项目。
! O/ J% ]& A$ ]2 U3 _; o! @& w8 z6 b+ P3 _- [+ I, z% }
    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
1 u. x$ [. E: u! R3 L' ^2 O9 T8 i: r! r! ^3 s0 I* K5 c! i+ F. q4 e
    将下面的代码粘贴到里面,然后保存。
4 @, v; I0 z# e# H3 L  A6 R$ y3 G& l8 L& m1 X. o
    constWrestling=artifacts.require("./Wrestling.sol")2 N, n8 S, a1 E  f) a
' d, Y! x7 u* E1 H
    module.exports=function(deployer){
/ D& `% R. l! q0 p- z" L6 h- i& j5 G0 @8 X, ?# N2 i+ Z& D9 [; u9 p# X
    deployer.deploy(Wrestling);
- |/ B4 p, d- R0 j* d8 h3 ~  C5 q5 ]
    };
0 K0 M! f( X# U! ]$ f6 L( Z
% l/ I$ M+ z# V5 H: k$ A    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
( s7 F( N: p4 C9 p+ \; `# q3 y! F
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。
2 t3 ?" y& C& q0 t' ~! F  Z; D% H  x4 a# l
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
' }# J( |5 Q  S( V& n( P3 _
/ s' c7 u% n  W+ N( E    module.exports={
5 x$ Z) Z4 ~8 o8 [9 x
; s" ^8 _7 t/ x# {/ p% F5 }& X; U    //See) ]% ?+ t9 h9 n
5 b: @- W4 ]7 z% Q2 B6 L0 Z$ c9 B
    //formoreaboutcustomizingyourTruffleconfiguration!) l& W8 H) S, R* }2 U/ t
4 n( Z/ H4 f- F- b4 B) h" T- X1 C
    networks:{
2 N- b, F, f. M0 T8 X& X0 I) B& d, y& {8 @
    development:{
0 f" T- Q* d- b8 y7 t# W7 G* Z) [# W2 x
    host:"127.0.0.1"," ]+ B# u8 j+ h6 _4 h4 y

/ F% T) H" c- T3 G% o- a    port:7545,
/ v- H' ?* e5 J- A% W/ c7 L' Z1 P4 K8 E$ @& r, L3 e6 j& {0 m
    network_id:"*"//Matchanynetworkid- W5 p7 k: N( l

; d( F5 b9 P4 `+ `5 N+ V    }
( A: F& C8 G. L6 e' S2 o. N; K& W  e; j6 `- R2 ^
    }
% u8 d6 B) h  i, S* d1 S
7 Q6 r- ]7 h% i7 E    };; N6 W! f8 b- p# B: N* `# P7 T

  P9 T7 M- ~4 N* q, P    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。
& g2 A& s1 X9 L8 h4 Q& F6 `' [0 f; V3 D% f- _3 i
    现在我们准备在区块链上测试代码啦!  C/ _+ w5 ^) T# R, z. I# v
% B! U# V, i. H) l+ z1 x$ B; P
    测试我们的代码
2 X, m2 o9 _; E( v2 y4 |+ S: l7 u8 V2 ~5 }( m( O9 _
    在第一部分,我们会使用Ganache。
/ V- @$ D/ N5 J2 ]6 `
; M: f0 h7 ^# c; ]# g3 }    启动一个新的命令行,并输入以下命令:6 ^. V3 o6 `) z  W: a3 @6 n

! m2 U9 W" g  v( c    ganache-cli-p7545
. Z, o1 g6 a  k1 l' q
6 f8 r9 ~- c0 y- {* Q8 X& m    它所做的,就是告诉ganache-cli从端口7545启动。& K6 l$ i1 p9 f1 T* i; B, h5 N
* M0 ]4 C/ c; _
    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
' ?) r3 b( Z% i7 w% t, W' w7 O5 n6 V
) K! q# J5 n- }3 s    现在,回到我们的第一个命令行界面,执行两个命令:
& z( G3 C- V% z3 ^  y: P1 p  y! U" ~! ^9 s9 r- v2 ?' a/ U+ I
    trufflecompile
* R) B* W/ ~- E0 R+ X% D: I+ l
  |! F1 ~! n1 I, h7 @! @    trufflemigrate--networkdevelopment' N0 q/ X  M7 e+ M. F, N& E) W& T' W

' A  i; {( c0 N8 Q: P5 B! r    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。) D/ @2 G1 M6 I& g

( L5 N  W8 D1 l# `/ ~    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
5 K* k& B9 k! p9 i- k1 w- ^  q+ z4 C: J5 l, X
    现在,如果一切都按照预期进行,你应该会在终端上看到:
6 X5 h0 D7 Q! p6 r9 L2 j: _
" W) a) B" C% O+ b2 [    注意,这里显示了实例化的Wrestling合约的地址。
* Z3 Q& z) W4 q& x- K, G* E6 s3 }1 F8 R+ A
    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:0 G. j0 J0 D6 R7 y' Q- ~! @

' z0 q2 S1 U- C/ x' d# c    注意,它显示了实例化的Wrestling合约的地址。, v( o' u1 k% g% O( t

; t. @1 U6 W( X) O3 D9 C# a    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。
1 ?4 |+ O' g" i. E( u/ y+ ], a0 x; o5 }
    truffleconsole--networkdevelopment. d- d9 Q5 `& Z; J

5 b, z, J7 y* T& u% Y5 O    首先,我们会执行这个命令:9 G6 J1 q% D. n1 Z
! n; X, N8 }# X+ j+ @6 ~/ i1 G
    account0=web3.eth.accounts[0]
9 Z- ]% t8 ]# w! k" V% h
- r' ]# t% X- R2 Y" W5 q1 M    account1=web3.eth.accounts[1]
: h# w5 R- T: J! F" s' O( x
" G9 L$ a  Q! S, a8 ^0 f    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。0 G2 ]  |  Q0 g' y, m; ~

4 \, X  _6 K9 l9 f    然后我们输入:
5 B; n3 {1 y! F. C: z) g) ^( v! e" [+ U' J
    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})" k& ~+ ]- v5 [5 G. ]

8 z9 p' M: H/ u5 P8 t$ e( J) G    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
( r0 o! m( B+ f. X+ s# N2 I0 Z, N0 B4 ^) T1 a8 c9 O0 N  u7 T
    执行下一行:$ J  k& C5 |1 n% V; w& X* @8 O" ?& L
7 P; w+ o) W2 k0 E" g( Y5 @9 d2 `
    WrestlingInstance.wrestler1.call()
/ V. s; \  q9 |) z- D% k
6 D' h; n/ C8 f0 K  t  V7 o+ Q( w    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。, q" v5 A9 c- e* V- A
" p" a$ u6 w- i  w  _2 B' Z
    然后我们把第二个账户注册为一个对手:
5 g( g, I5 |" a' R/ J& L# Q" j: [; e! V* p9 R; V) v! [! B
    WrestlingInstance.registerAsAnOpponent({from:account1})6 o- |# |1 I0 @1 i8 ]$ u' q
# B, Q' l2 e4 F
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。; t, _& J* h1 d$ U# o8 R

9 V6 d* N. w2 q    在执行这一行之后,它应该会返回类似的内容:
1 K/ u7 x. ~& \* T2 C9 V$ Q  P0 S5 h8 m% |
    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。6 q" u- i* E+ Z" Q
' B! X" E+ k8 i! T9 h1 E
    你可以通过执行下列代码来检索第二位参与者的地址:
7 p" e6 O1 w" s( x) [7 d( m0 o6 L$ R5 \) D) V7 e# S7 ~" ?
    WrestlingInstance.wrestler2.call()7 m. Y/ H# D" N3 H# c

3 ~# n" q' I6 t! p  q6 g    现在,玩家们可以开始角力了:8 i: F7 Z. u8 c, }
* t3 c* [! [/ z7 {
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})
) f4 `- H4 _. S$ w- v# D! U
4 F7 _' e) o8 T6 C$ _! C6 t    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})& w$ c7 }$ {: i# G

$ b! Z3 l! P, Y6 T2 Z! V' ]- f    //Endofthefirstround" e5 `" A, x- z' P. m# S, ^; c
* `" s6 G5 W! i1 x9 c" _( l
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})3 g8 I  i3 m; V2 E1 B6 ?9 K
* s% c+ ^  u- l0 r: p% m( h
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
$ Y. M0 z4 I$ @  R0 ?( ~" b7 L& X+ H6 J+ H
    //Endofthewrestling
1 l5 `1 b4 b, O$ v5 D( K: F* J3 O0 v, J
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。, d8 Z4 D  z) B) |  X# c
! D  Z) ^. ?) L
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。/ y4 T- }4 Q2 O% j' g- X% x

8 k1 N9 z' S2 `, l    给你留个小练习:从合约中提取以太币。
  @# @3 k' r( h4 m! B3 C# x& _" V, C
. ~! u) r. I4 `* f' o3 e+ R4 N8 _3 C    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。
' K9 |7 Y7 |  J  [# k1 t
9 |5 X% Q, t6 c3 H' H    geth如何在这个过程中发挥作用5 ~3 Y; B# \9 t
4 ~3 W6 j6 t0 z8 m4 Z
    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。: q$ `; l2 r, e

9 [) O( H/ t8 Y" C4 F    安装
9 P+ E6 t8 A3 Q7 K5 u' E. ~/ q4 I, R$ ?) x3 y1 _  \3 w  [
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。2 g; G" Y! W4 ^2 ~. S! l

% {: R; k- K- \; P' ]    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
6 g" j& Y. `  K1 s) `% C% {9 E/ r+ \) \! z: O4 W* {
    创建本地私有测试网络
3 ]- D7 e4 q: Z: f1 H
2 b6 N* Z# G+ k( {( P    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。
- F7 l. ]' c. N1 x% Y8 w! t2 V' g
  v0 }: ?- q$ h. p) N+ w    {
+ Q% ]  m0 u: J. p* F. B8 Z( n5 Y; a) h1 W2 U) V! X7 z$ i
    "difficulty":"0x20000",
- s3 g' N' |9 A1 g% G0 w6 J9 p- L, i# ~/ f1 H
    "extraData":"",4 |' {' V8 V. d* _' G3 G
3 @: f2 G0 P! B
    "gasLimit":"0x8000000",8 `6 ?; ~  @9 ^% p

9 s- f3 E: W6 ~9 k8 N( l' x- ?    "alloc":{},' f5 C4 t4 Q5 D7 T
6 f( Z7 i0 C3 P9 X! M
    "config":{8 _4 o# {) D9 C4 @! K8 `

( A+ [2 E7 K3 N    "chainId":15,# m! _+ e9 ^: y
" ~9 l; a1 k/ c" e4 \4 }& \
    "homesteadBlock":0,
/ n4 ]3 q( d# k' u
$ E6 @: x( |, W    "eip155Block":0,4 d+ H( q& \9 C7 `* L, y

: U7 L( Z- N. e' p    "eip158Block":03 E! D; F4 K$ W- U; \
. v5 d! k  ^" a: T4 @0 _
    }4 X7 K" Z0 v4 D" ~  Y4 y8 U5 B. E

0 G; @" {7 ]: l/ |6 U    }2 s5 D& H$ R. j; |7 |

5 Z# ^. U) I+ O4 l; j+ g    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。
/ ]0 {7 h  E2 |% Y2 C
) O7 s9 y4 L1 B9 V! u- t    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。# e' \! o) J9 R1 j$ E
, K" ?7 G, {/ y- y) Z6 J* c
    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。6 n* @2 A( w2 Q) s% Y+ W+ W

! c3 c8 S  j3 Q3 Z! i    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。$ d/ d7 D/ X( d5 V
) `; M, p7 s: T( p3 }$ |# A
    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):( G! ]8 ]# S6 l4 Z
9 m8 S/ i* X( m2 s' g
    geth--datadir=./chaindata/init./genesis.json, U- V) ]+ C* Y% z* P" D& {# Z

. v! A! I5 n1 J    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。! ~9 u: }- \* D, Z+ r

3 }$ h0 w$ g& z% C8 [    接下来,我们使用以下命令启动geth:
6 R" {/ T3 D8 c  U# ]! F, R* f3 J$ t: H" S" Y
    geth--datadir=./chaindata/--rpc8 t  N3 Y! t' x* ]$ s2 Q
  H# p4 `6 y8 ^$ V1 j
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
1 K3 P8 I" ?( g( [% w
' J/ C! ~; a; K) J% V" \8 h$ _    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:( x3 g0 |5 N0 \  [3 h+ k  o; b

2 r1 x' Z. X3 R/ w# c, Q; N- I1 u    mist–rpchttp://127.0.0.1:8545+ N/ }0 `7 n, r3 [) Z- _

5 `6 Q9 F/ s3 T7 Y" `    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。
% v  b! C7 y  ^' B4 Q* ]+ B9 w- @# W4 a& f& r6 _7 m5 B% y  [
    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
9 O& D* m0 G5 t9 O$ C" C" a( R1 z0 O
  ]( \. b& d9 {# z5 q4 ]1 s: r/ m    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。4 q1 V0 i: p0 m) p9 G/ k
( B* |& L- K; y1 z/ @, f" x$ j
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。
& i( I/ g2 o$ u1 ]
1 I# N* ?& z1 \) M( ^    打开一个新的命令行界面并运行以下命令:
$ V, i+ o% D3 r  }' ]
; z8 ^; s) i* p. X% Z4 B, i# l# o    gethattach/ V. L. u# N7 F( Z, r! k& P5 X% e- C
& k; I& {6 X' S2 l
    它会运行geth的控制台,现在我们可以与它进行交互。
$ k  o3 Q8 H* p: g( V% f+ L0 P/ ~: S+ j3 o, R  f: V- ?  p
    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:3 Q# l* x5 r- S* ^8 S

6 h  q. F5 C- n# }) V7 c1 T    miner.start()
+ g% N; V2 c- D2 `6 @' G1 Y8 [$ Z$ E/ n3 w
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。, s5 l' a) s4 g" @. U$ g
  h- e7 j  V' B1 Y$ l) J- v
    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。
* p$ I+ b" H) h' c; [
" K% d( S* I1 `& e7 c5 Z    现在,再次打开“truffle-config.js”文件,像这样修改它:2 \* q4 J% T5 ~7 o; |

* w( M3 W) o# K2 i9 f* v6 v$ u" C3 x    module.exports={
( x- k3 @( t/ L' x/ w5 p2 {: ]$ o+ `+ M
    //See
1 `4 F: z' B4 ^9 I: u" Q! c# X; b+ ^3 l0 E" s+ Y
    //formoreaboutcustomizingyourTruffleconfiguration!
# `% w2 h" s: R8 W) _: `3 E1 B- d) S, D5 X
    networks:{# B& V, `( P$ O: N

! K+ g( g4 U, h8 n1 v    development:{; b! J* R% x2 O1 Z$ W0 O7 d

* J! O9 H. v) _7 c7 ^    host:"127.0.0.1",
* P* |& L& }# M5 `3 E6 d$ `
! }: j5 M$ F- ^7 h- y    port:7545," U/ O# v% b0 [- W
. o4 J( D: d% r( x  b
    network_id:"*"5 O0 q# {# r: N+ E' Q# ?/ X

0 v7 s/ q; H8 C0 s2 Y/ |    },
0 o# j, Z2 `9 C+ y6 T# y+ S1 M/ }# E4 s: U' ^+ C
    ourTestNet:{" y% m; i+ \/ S1 Q9 o, \& W

7 Y$ P8 u9 {2 ]5 X! p3 C2 ]    host:"127.0.0.1",9 @( k" S7 [  y1 k" J, Z( d6 Y% y

2 u  k; h0 Q+ b) p2 \    port:8545,
; \. a  V* B  M  B- L7 g5 x$ A- O/ ]! u8 ^( z/ O# n
    network_id:"*". e. _8 B) I% v6 x2 F/ f

9 Y! B- |! ^& M% X) N: _    }
3 E; ~$ |+ m2 c$ E* J) w1 x1 s. G+ T% I$ n. U0 A
    }
2 f3 c5 C% V0 [8 n) u/ s8 q) P3 K6 |3 C
    };
/ l' E' I) o: M" {4 Z
9 B( ]9 W! Z1 [) x    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。6 ]: U9 d) r5 }" g

5 r5 ^* c9 @( N( N1 r% G% V    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:
2 z# T) b4 [9 y: q8 Y
; Q' P3 _4 X. O    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')
8 m# }6 X8 q  `& ?, X( T: g
+ r* A! U- \. m    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。' @8 v* }* _0 Y* p, e, e* H7 s- i
7 ^6 O. a, W' c& s6 ^
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:  h7 J1 K5 K9 {! f8 C% |2 t
  o% D* W, D4 U4 B$ I" ]. N
    trufflemigrate--networkourTestNet+ M. E- ]. u7 O$ h2 a; D
8 H9 Z* P0 K3 X/ o, G+ F1 Q" k; m
    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
. r* k1 c# b$ ^5 \) W, Y
, C, k' T& Y& d. c; a. e  I& @0 \/ `    现在,运行以下命令启动Truffle控制台:
( ~( C( r- K2 }8 M8 A! ]) O! ?! V; p2 ?$ K7 [8 `2 L
    truffleconsole--networkourTestNet& \9 B, v( N. d9 ?7 H

8 y' t' G# u0 I+ H- J$ C% R+ t    然后运行这两个命令:7 }, E$ c, Q7 i- c

) _% _/ n( L. ]; j, [0 I3 ^- [9 }    Wrestling.address8 `1 [& K4 m6 o) _

6 v' n' Q( N4 K) |+ R    JSON.stringify(Wrestling.abi)
$ D6 x0 d  Q! X3 o7 ~* ^9 Y
0 Y6 Y$ z$ v" F. L* r. g7 f    你会看到这样的输出:
% J( R; P3 ]- I5 f: W# R1 M
" }/ Z5 \& h8 v5 `- ]    第一行返回已部署的Wresting合约实例的地址。
9 N( Q& o; C6 T2 l6 l5 S
  V8 J- w9 z/ g- o/ R" A  M, {    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。4 N* G  t5 r  j5 p5 y
3 v$ @5 m' q# {" w
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
2 ?6 E) `. c5 d4 D: E% M7 V: R( e- z4 J
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。
, R" ]$ E6 ?0 x( m8 h. o+ G
& I/ E) d6 V6 X1 X& Y7 v1 O    然后,复制之前部署的Wrestling合约的地址和ABI:
' v/ m. ?8 D$ {0 \. U6 ^/ e" A' x% P6 u$ e' ~( T4 ~- S+ Q
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:; n5 P( e; n0 q' p  t. Z5 J) ]1 z

  ~. R/ i0 z- v% H. }( i    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
# C# W$ B- o+ s/ D7 R8 B2 r  n: J6 T+ a" q# D  W; d6 i
    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。) v+ d) L% U3 O2 v! N- w  I5 A

1 K, \" P4 u8 A: L5 O' N    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。' I" M5 q  M" o, e; s' b. U

: A. A0 b# ~! ?3 {9 ]    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。  A# e; _4 f+ {+ _

! y% ]4 E& L+ E3 q. J    本教程的资源库可以在这里找到:+ G: |& v, e4 F$ }$ ]
' w0 z6 w  w- \6 _/ X
    devzl/ethereum-walkthrough-2( O. s& j; l. q
/ |* u% `2 `8 ]8 O
    总结
, ~' y, F/ g# }  V4 p5 L% ~* r9 T2 k9 a- C
    我们已经学习了4种开发和部署智能合约的方法:- _) ]+ f) m" l' m' X0 Z4 c

, Q4 T7 S. K1 C  o- Z  @. E8 T    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。
! ?9 s; V  ^' g1 s5 g" z; G4 }. s8 J: j9 `2 X: `8 _! ]
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。$ x, s4 d4 |% `9 w. Q# l" M6 s
, r' l4 b  I3 g
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。
% R' s: ~' \$ u' ?" {9 ?  {5 E  Y* A' K, S, j
    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。2 ~/ z8 B8 \% q4 J( Y7 q
8 q8 w" l% }1 k0 R0 @# u
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13