Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
部署合约最重要的工具有如下几种:
7 G8 J. Z% T& S' U/ M+ o
5 z' A7 e' z8 N% l1 L6 x- @    Truffle:是以太坊的开发环境、测试框架和资产通道。换句话说,它可以帮助你开发、发布和测试智能合约等等。你可以阅读有关Truffle套件的文档,了解更多信息。3 C9 K# o5 l- [+ D9 K" @/ j, l

% m$ d4 C* _6 p; r    Ganache:以前叫作TestRPC,如果你读过几个月前的教程的话,有可能他们在使用TestRPC的情境下配合使用了Truffle,它在TestRPC和Truffle的集成后被重新命名为Ganache。Ganache的工作很简单:创建一个虚拟的以太坊区块链,并生成一些我们将在开发过程中用到的虚拟账号。
8 f4 l/ @* H2 `, }, H
1 v. ]# V; L) u$ A% {    Mist:Mist是一个分布式网络apps的浏览器,相当于是只针对Dapps的Chrome或Firefox。目前来说,它仍然是不安全的,所以你还不能在不受信任的dapp中使用它。8 [7 S  Q* k/ A% R6 J0 b& G
+ Q: s% c: I  j1 y4 b7 k
    以太坊钱包:它是Mist的一个版本,但只启动一个dapp——以太坊钱包。Mist和以太坊钱包只是UI(用户界面)前端,我们还需要一个将我们连接到以太坊区块链的核心程序(它可以是一个真正的以太坊区块链,也可以是一个测试版的)。, m1 _- }; a+ y! g* k9 L5 F+ T! ^
. S' f( {: j7 x7 F; L
    Geth:Geth是把你连接到区块链的核心应用程序,它也可以启动一个新的区块链(在我们这个示例中,我们将创建一个本地测试网区块链),创建合约,挖掘以太币等。$ Y7 S6 M0 P; V# c8 n7 }( v
' Q1 @& |5 U( ^
    我们会先使用Truffle配套Ganache,然后使用Truffle配套Geth和Mist。
: y( `( _! s! R4 j% @% R
* I+ y) r  M4 }" o8 f    安装
$ \, r: a! `+ `1 ^: i$ B" K
4 D: D! l# `* R5 e, c8 W3 N    本教程的要求是你要知道它是什么以及如何使用命令行工具,并且你要稍微熟悉NPM。
' t' D, h7 }. R6 r' X/ J% [" s* ~- G3 L& t2 |5 X) x! j" N0 ]
    Truffle
5 E1 [0 P2 G+ Q  T( l8 U- I. s0 `: n( a! N" |" \2 F3 H
    打开命令行,并输入:1 g' v8 U9 |+ ]  v

0 I* d, A0 N% t    npminstall-gtruffle
3 c, f) D# p, H
2 z! `1 C+ L6 |% }9 p    如果出现错误,建议你多阅读有关Truffle的文档。4 w; O+ y  Q* A* u) j% d" j0 U
' E& H0 s' z' E8 @8 l" G. g
    Ganache7 W; M9 i2 A  M; y
% B0 V! B) R" U; ^* E! \3 x
    然后,安装Ganache的命令行界面:% B+ ~0 j* F, g7 G# U+ u* t4 u
+ h! J2 a8 Y- m9 y
    npminstall-gganache-cli
, U/ V6 m1 \/ Q) U+ \$ x! m1 m8 Z; M6 S; z+ k
    如果你对此不是很确定,点击此处访问Ganache的Github页面。
; f, Z4 L+ C, W9 e+ a% P- s
5 b2 b2 h, `1 b2 v+ g5 L    注意:这是Ganache的GUI(图形用户界面),不过既然我们都是程序猿,还是要用CLI(命令行界面)。' K0 V6 d+ r: X1 @# |
1 ?0 [( u6 l7 i! q
    开始吧
% S% G' S, k4 A- G/ ]# ?' P( C4 `9 ~9 J+ d# Z# U& k
    首先,创建一个新的文件夹,并输入。
1 j; ~3 G1 x9 [5 e9 D8 C8 ?
- a9 a9 E' ^  c  R5 J    truffleinit
4 h- |; ^5 F' w) F6 d9 Z, G1 h) k- w( @; D4 _+ C
    它会初始化一个空的truffle项目。
% q0 m! \# A+ E! C; f$ [
& Q; ?) X$ t3 }5 Z    然后从上一个教程中复制Wrestling.sol文件,粘贴到到contracts文件夹中。接下来,打开“migrations”文件夹并创建一个名为“2_deploy_contracts.js”的新文件。Migrations只是帮助我们将合约部署到区块链的脚本。
- H. X- R) r, g9 X+ P/ T' X. `/ [4 b0 P
    将下面的代码粘贴到里面,然后保存。( [  l- g, F% \; {; {% J3 r% u

7 S2 P1 S5 g. j, S7 F    constWrestling=artifacts.require("./Wrestling.sol")/ R' V/ G* l& Y, \9 ~( X( Y7 ?

5 q; p) v# T( a# X1 B    module.exports=function(deployer){
5 {" u% J& u$ V* Z' n; |/ ]9 I$ T7 q9 ~4 E1 M
    deployer.deploy(Wrestling);& O% f& v! J5 N2 r$ j( l
  ?4 |: ^0 [! D7 L+ L. ~% }, P
    };3 g9 m" {' Z/ }  Z1 ?: ]! y. N8 A; ]
5 r' F/ O: W( k% @
    第1行是用来导入“Wrestling.sol”文件的(从“contracts”文件夹导出),第4行则将它部署到区块链中。
* {4 \) j' b# H5 o( l+ p( |) K* ~& x7 W; A" N' S/ @
    现在,回到根目录,你会看到两个文件,“truffle.js”和“truffle-config.js”。如果你在Windows上操作,那就删除“truffle.js”;如果你在另一个系统上操作,删除其中一个或者同时保留它们,都不要紧。这样做的原因是,在Windows上有一个命名问题,当我们想要执行Truffle命令时,它会打开“truffle.js”配置文件而不是读取里面的数据。, s8 P+ s2 L8 _% r! u
  O8 j5 Z; {' y* f/ ]
    我是在Windows上写的这篇教程,所以我把“truffle.js”文件删掉了。然后我会把这段代码放入truffconfig.js中:
* C; n4 L( e8 ]/ `% p7 h- S9 C2 a9 d* A- R' D0 ]8 |
    module.exports={* l) a1 e/ a9 e5 d/ n
5 H# j1 e& v  T" {- ?4 M. T
    //See
  C+ V# v, X# W. I8 i* E8 H# B9 d( k$ a+ g% O3 W8 C2 W
    //formoreaboutcustomizingyourTruffleconfiguration!
1 g; O8 v  m1 L5 B
' v( B! }7 P( ~7 v. y" G    networks:{
  Q4 J9 u1 g- x, O( b- J, A1 ^& M2 s; Y5 d7 A% ~% q" g& e
    development:{
5 X% g% C6 a+ s2 b! j$ ^# f0 d  Q* T  Q8 q' j& W
    host:"127.0.0.1",
2 ?# p! r  e) p% u  Y$ w: U: D5 }; y, c2 n3 {
    port:7545,4 g" z9 I6 c$ `2 H8 a, N- H9 v3 G
5 K; c4 R" v7 i. ~' o
    network_id:"*"//Matchanynetworkid2 x( v5 @: B* p" {& b# W
- P* h# w% [' `/ p9 H
    }
" T% ^5 S1 J. i3 C% @! x* P' |" a5 p
2 x" Z/ ~5 G: w( b$ \0 V1 @% N$ {    }
8 {1 E1 ?$ s5 d* A1 @' @7 @1 d& l) ^! \" j6 i1 X: H# y* U* Z: m
    };$ {# d/ G1 \: S* `& l: Z% N. n3 k% |

$ x$ m" c2 x0 U/ C( r" A' _    基本上是说,当使用开发网络时,使用端口7545,连接到127.0.0.1(localhost)的主机。" q1 B: [* P8 j0 d5 s0 C, M- D( A4 S
) m& w" N8 j, @. L0 V& W
    现在我们准备在区块链上测试代码啦!
# a: |4 K. x1 ]$ y# }+ f4 ?9 Z1 I# y" j
    测试我们的代码+ c4 |! `# D9 _1 `( h. M0 p; T

7 l3 d$ i2 o3 Y  U3 }$ S9 X    在第一部分,我们会使用Ganache。
7 ], O" A. `2 f2 a; f/ Q) n5 e8 b! f$ T! q+ W5 P1 c
    启动一个新的命令行,并输入以下命令:
( Z; `7 m4 |% \* y; d
; s1 J$ K7 O6 p, E. T; Y    ganache-cli-p7545) n1 ^" i' E- ~

$ q" [, P% J1 N3 t5 c    它所做的,就是告诉ganache-cli从端口7545启动。7 p. G" B% E5 R- Z2 t( @4 I2 H' z

- k# W' h1 w) g+ T5 c/ F    Ganache会为我们生成测试账户,默认情况下,每个账户都有未锁定的100个以太币并,所以我们可以自由地从那里发送以太币。第一个示例账户就是这个家伙:
" G4 H- L. w  v5 h- V( o% N
" y% o  A% }; z8 o5 Q, b& n    现在,回到我们的第一个命令行界面,执行两个命令:
* n  e1 D) L7 Z3 |: R: }. }9 h* l. W
# P' M  D8 `- i8 L4 _    trufflecompile
. R# t6 F7 V( w  j. I) h' A) n
    trufflemigrate--networkdevelopment
0 W1 L% c' E2 G, }2 y+ E3 S4 n, o3 Y! h2 I2 p. ?( K0 r7 ?' m
    Compile将把我们的Solidity代码编译成字节码(以太坊虚拟机(EVM)能理解的代码),在我们的例子中,Ganache模拟了EVM。
6 I* X3 x- v$ M8 a+ R8 _6 j  h
1 m: |* S. J' ~* q' a) g2 V- }    Migrate(迁移)会把代码部署到区块链,我们之前在“truffle-config.js”文件中设置了“development”网络,我们可以在那里找到区块链。
: h6 T$ q+ Z5 x/ R/ \2 z
; B- A& N# o* w- g) }/ ~% d0 \    现在,如果一切都按照预期进行,你应该会在终端上看到:
) F6 S' E( z: s& j% B
1 K7 n, c8 [, k- `& a    注意,这里显示了实例化的Wrestling合约的地址。. W& R: t9 _, Z% A3 I, k

: M* ?- h* E  `9 r$ \: @    在ganache-cli运行的命令行界面上,你可以看到正在执行的交易:% x. [: ]) V! L  |
! N" U% S& S0 ^3 k- z) X/ m
    注意,它显示了实例化的Wrestling合约的地址。
9 g0 ]+ |& n) b. w
) ]0 u' k. G7 O; B# ?    现在输入以下命令启动Truffle控制台,这会帮助我们与ganache的区块链进行交互。) u5 W, B: b! q
5 S: G& o0 [0 p) t2 \" q
    truffleconsole--networkdevelopment! B. j0 m; L9 D( P7 g

1 L+ k( Z0 O* N4 [    首先,我们会执行这个命令:- a& Q1 g3 o) \: u! Y, V

$ a- Z, s- q4 `$ k    account0=web3.eth.accounts[0]9 r# K! Y% U5 Y" Q

3 F1 R. O9 v8 c' a+ ]4 d    account1=web3.eth.accounts[1]: f. P# S  m% Q9 }
* Q4 O, ^" j4 p# @* X
    它会把第一个帐户的地址分配给变量account0,第二个帐户分配给变量account1。Web3是一个JavaScriptAPI,它将RPC调用包装起来以方便我们与区块链进行交互。
/ `7 x7 e+ y& F3 m! m1 P# A! J# K3 E0 u* @" `
    然后我们输入:
' |: D- {- |+ t" |3 k
6 [" c  Z- F4 v' a3 n% E. e    Wrestling.deployed().then(inst=>{WrestlingInstance=inst})
  W) W2 R: l, y$ O+ W4 l8 F
+ ?% M7 b* E" F    它为truffle部署到变量“WrestlingInstance”的合约实例分配了一个引用。
% ?/ o' ]7 R/ t/ i2 N  `9 G
* F7 q& ?; I6 |7 _    执行下一行:. I5 p5 [: r: g) L" E! W5 N
0 v1 W6 a) }% q
    WrestlingInstance.wrestler1.call(); {+ ^3 {  a# g) e

; P6 b1 k7 d: ^5 N6 f* z& c' G9 b    它将返回参与者1的地址,在我们的例子中,这是第一个帐户。在migration(迁移)过程中,Truffle会从Ganache选择默认账户,因为我们没有在迁移过程中指定另一个帐户地址或是Truffle配置文件中的另一个地址,所以这是第一个账户。
7 {4 T$ x" ?  P1 m
" @, `7 B  Q/ `. Z    然后我们把第二个账户注册为一个对手:
: a% U0 X7 j3 s  y: ~2 C
- Q0 v& J# T6 D' o0 F    WrestlingInstance.registerAsAnOpponent({from:account1})$ u1 z; N0 C2 l- e% _1 F: [
4 Q) Q) [8 f/ v5 K
    在这里,“from”指令会告诉函数应该从哪一个账户触发交易。
, ], b( m% |, \6 p" R" B' n- c2 d: H# l, X: w' `, i  E4 S0 m% W- s
    在执行这一行之后,它应该会返回类似的内容:6 G7 O  c4 H" j

; Y' y9 ?) g8 }& E  _; u    注意,该项交易使用了Gas,并且触发了“WrestlingStartsEvent”事件。* s! M* E/ d: W- A! q

+ K8 h5 t/ ?0 ^& t" E% \" u9 S    你可以通过执行下列代码来检索第二位参与者的地址:
3 a! y( z$ n$ Y6 D6 y( C" \% v8 F
3 D% P6 e4 P/ m8 S. f    WrestlingInstance.wrestler2.call()' [0 }% t+ o$ W+ {
/ ?* z( k" v% M0 S# k  s. u) x
    现在,玩家们可以开始角力了:8 Z( Q; \' ~6 ]1 T, F  S/ s  F
( P/ T: y5 {. e: u$ f3 B# a' Q
    WrestlingInstance.wrestle({from:account0,value:web3.toWei(2,"ether")})8 e5 Z: n1 Y0 \6 t' t  V$ p

  i: d8 h. X* \* X    WrestlingInstance.wrestle({from:account1,value:web3.toWei(3,"ether")})
7 p$ q9 V! {" \
% @- a" J9 [" e    //Endofthefirstround
1 ^7 h, F9 h2 I0 k
" [) h( y6 b5 B8 }    WrestlingInstance.wrestle({from:account0,value:web3.toWei(5,"ether")})
* p/ @# m- j  V* Y+ W( L+ o+ V* P+ v& D0 W6 h5 Z
    WrestlingInstance.wrestle({from:account1,value:web3.toWei(20,"ether")})
! H: {% G$ O( t' u  ]5 I' v1 K% N$ z+ k0 [! w1 L
    //Endofthewrestling$ U4 [  q) ^8 N/ v' G
" H. {/ I& R( ~1 S8 b$ N4 t/ s8 J
    “value”指令用来在交易时发送以太币。“web3.toWei(5,“ether”)”意味着发送5个以太币,这个值会被转换成Wei。Wei是以太币的基本单位(最低面额)。点击此链接,可以找到更多的信息。
( f( m7 q) {# S+ x/ o. P& k0 z; v7 e/ ?4 U( s( A  [7 E
    在执行最后一行时,account1会是大赢家,因为我们总共投入了23个以太币,比我们在account0投入的两倍还要多。  m$ X, \* u. c, P# [

. ~- C) M2 A# E- Q5 B" P    给你留个小练习:从合约中提取以太币。
( f; l' N$ A( s; M2 M5 m( M2 w# K8 ]" O2 a
    现在,靠你自己研究如何使用Truffle和Ganache的高级功能啦。你可以从阅读文档开始,或者,如果你感到读不懂或者想要加强你对刚才所学知识的了解,这里有一篇很好的Truffle介绍。. t' |6 M' n5 ^$ I* s- Y
+ V4 ~) L9 k- a
    geth如何在这个过程中发挥作用
5 `5 P, j* W2 G6 I' J$ r8 o6 @0 b
& g& b( }7 q% o, {    好了,我们已经使用了Ganache来进行开发,现在我们想要试一试更接近真实运行环境的东西,就算只是让自己更熟悉运行环境就好了。5 ^! V: B9 M0 s$ D. d: N. [* ^

2 R, E9 v8 ~% Y  ~" j- J) R& s    安装
2 d" ]6 T7 K- [2 v' E& \/ l) o5 T& m0 Q* ~
    首先,下载geth。在Windows上,你可能需要将geth的安装文件夹添加到你的PATH变量中。2 I( H* c6 ?$ m
' ?. l/ f: q' H7 M
    下载Mist或以太坊钱包。其实使用起来都是一样的,所以选择哪一个都可以。
' N! t6 F. R9 n+ N5 y5 J. o& n+ o2 c; q
    创建本地私有测试网络
2 v  u8 p0 k. E* [0 d# j* v7 ]
7 O+ F. L" t2 }+ @% o& p4 w    在同一个根目录中,创建一个新文件,并将其命名为“genesis.json”。然后把下面的内容复制进去。" r$ C/ D8 V$ \5 K4 |) l4 {

( s6 I+ l2 z6 }8 N4 F. t1 {    {# [2 [+ y+ q* T9 }
) \$ c  J! \+ q, u9 M
    "difficulty":"0x20000",
3 m, q0 ]$ h8 n8 R) Y+ i
$ A# \4 _! \, g    "extraData":"",
! Q5 B5 S6 A1 T0 V' z
$ h( ]- ~: S# ]( v$ @7 k    "gasLimit":"0x8000000",& h. o2 D6 a( D! j" K3 B( |2 _
, _- @$ R- G+ [* R  J& m- x( f' _
    "alloc":{},
/ ], y: k% Y/ x9 b* @) B- `
: Z. C9 D7 v& [/ \* O2 M    "config":{
; s* \; C/ @- b" b$ i6 c' e0 P- ~. z# v# {& V$ S2 X+ S4 o: y  x6 W# t
    "chainId":15,; d9 S1 v0 `; u$ Z0 O* K6 m
- H& P3 j2 I  N( a
    "homesteadBlock":0,
( P. m* j- t" e: j4 U( ?9 w: H. J& U( r9 U* {. [) D3 i+ B/ T
    "eip155Block":0,
8 @6 w" B  |; R6 f- O3 G. i; y4 K" Z: M2 F6 c
    "eip158Block":0
% q  t# c8 \0 z( [, A; ^' v
  P! O# O5 q4 X* p5 N- s0 [    }/ `' ]5 ]3 ]3 w  p
$ H! S6 o2 P: O2 m. x' |7 h
    }
) D! a3 Y8 }$ m* _
3 k1 ^+ h' V& N, d3 V3 V    “genesis.json”是一个配置文件,geth需要用它来创建一个新的区块链。现在了解这个文件的内容并不重要。: Q% A/ {% {: D& e* @4 z
, H# C# _, U' [
    如果你在没有指定任何参数的情况下运行Geth,它会尝试连接到Mainnet。Mainnet是以太坊的主网络,是真正的以太坊区块链。
; L3 K7 X& i' N$ K
& _8 ]: q9 A$ d6 d( U    如果你在没有指定任何参数的情况下运行Mist,那么如果geth实例也正在运行,它就会报错。但如果你让Mist连接到正在运行的geth实例(我们将在稍后操作),它就会正常工作。如果你在没有geth实例运行的时候运行Mist,它将会启动一个新的geth实例,并最后向你询问它应该从哪一个区块链中下载区块。2 t( P/ q  G5 G8 d9 e. Q6 q
$ E! H9 @; ~) `
    虽然有公共的以太坊测试网络,但我们会使用之前创建的“genesis.json”文件在本地创建一个私有测试网络。# l1 n) p3 g% Q2 q

  N6 q0 t' c( e7 u& o' T7 m    启动另一个命令行界面并输入以下命令(确保在项目根文件夹中运行它):# X4 L9 s+ L2 H6 N& [3 o. q' q

: X( {  Z, B/ k2 f3 L' P" G# T    geth--datadir=./chaindata/init./genesis.json
/ `: \0 L' r( ~( V: j9 N' y, g2 b! n$ t; s2 \- I, q
    启动geth并指定区块链的存储位置,这里是在chaindata文件夹中(它会自动生成),然后我们用“genesis.json”配置文件对它进行初始化。
$ H; F6 w, d! |$ y7 L
: ~9 e- t% X3 u# Y, r    接下来,我们使用以下命令启动geth:
3 }6 N! ~6 I! f4 C7 q# Z& x3 `8 e6 I, }3 d& ^
    geth--datadir=./chaindata/--rpc
$ Z5 `: W3 Z9 ~- J! `$ B; n0 `6 z
    用“–rpc”参数让geth接受RPC连接,这是很有必要的,这样truffle才可以连接到geth。
( C) G; m' \& G2 ^  G- y3 W4 L% k! O& W5 K! B- `- _
    打开另一个命令行界面,启动Mist或以太坊钱包,使用相同的参数:
& s  F+ h2 _, r! N4 _& u' H: m, a" a; K3 ?/ Z+ K- N
    mist–rpchttp://127.0.0.1:8545( ?- W- \( j6 _9 H$ t5 p, Y9 J

* y/ ^* J/ j6 x    “-rpc”参数让Mist(或以太坊钱包)连接到我们刚刚启动的geth实例。. n# }% |; E7 n% D( a& R/ u

' L' b8 h/ i' y    在“钱包”选项卡中,按下AddAccount(添加帐户),创建一个新的钱包:
  h% S' H9 O$ F* ^4 o7 ~- v7 _- _9 {/ R2 z, h% w0 w
    请注意,我们正在使用私有网络。注意,你不应该为了开发,而在主网上上使用以太币。
& `8 T, t: ^. i" z9 ?  o* L1 \( v3 D% r) v4 ]$ U* _' Q  K) G
    我会用密码“123456789”创建一个帐户。在真实环境中,要使用更强的密码哦。8 G1 S" t2 D" C7 s5 L
% r+ O6 K5 v) P: c2 b7 P
    打开一个新的命令行界面并运行以下命令:
. k( d1 [; b9 [2 C2 `( V0 T$ ^- i) \1 ^5 a
    gethattach: ]! v9 U/ R6 a# F" F

5 u, O+ h6 Y# h2 l! t' r$ @    它会运行geth的控制台,现在我们可以与它进行交互。
- F. p7 l# k4 H9 c1 ~. L
2 C7 H; N$ Z7 [- l0 S* Y+ c2 y( |    无须通过在MistUI上创建的主帐户,我们将在“gethattach”控制台中运行这个命令:
7 T! H3 |/ ]; \0 c
1 o, }* x" O: I0 Z    miner.start()' R% e# j6 N/ B
$ M5 q% r) P- [7 f: h" r
    它会启动一名矿工,这个过程将会确认交易,而且在几秒钟或几分钟之后(这取决于你的电脑),你应该能开始看到你的余额中新增了以太币(以及你的主帐户也会有)。6 g! F" W2 r6 p4 ^: b# \% X

2 C/ L3 N  P- Y! D+ k" t    请注意,如果你没有足够的可使用的RAM,它可能根本不会开始采矿。你可以使用“miner.stop()”指令停止挖矿。- L6 K0 T/ _+ g- C6 P

& s4 }0 G# ~7 ^1 C* J% p    现在,再次打开“truffle-config.js”文件,像这样修改它:
" R8 c* i& F+ ^% N7 d3 ^1 a* l7 [% I9 Z& @
    module.exports={
& _' X# ]+ Z+ _) I8 H: Q( i$ U2 D6 m9 v7 @* q# c5 G$ E4 c& ?1 q% F
    //See
4 w. E0 S. ^  R, B' \) c& z& R
* J9 J/ D, z7 o+ H3 I8 g2 D1 I    //formoreaboutcustomizingyourTruffleconfiguration!
. l7 q" Z" n2 v3 f/ ^- K1 T# V( c/ R% h' \3 u* I" b" Z- G
    networks:{
4 S7 c, D& v; {( Y  Z' P7 O2 p: ^0 H7 w2 \
    development:{, b( ~( s- `( Y, H' G/ f
) S, p( m; a- L7 _8 L3 Q) h
    host:"127.0.0.1"," V! i* y; N3 E; `8 k/ W1 B

) ?5 X1 L& l" |" X    port:7545,4 K0 o' w1 ]# |! Q$ N# {) `. R' |& r

, ?& D1 h  B) A' D    network_id:"*"5 X1 b- w7 r; V  x
/ E* ^" h6 }, d0 ^
    },
1 E9 Y" i% A0 c+ U5 D& a3 ]: H, \2 u
    ourTestNet:{/ v+ \# I0 B# K
- ^& k. v( ?- r  k
    host:"127.0.0.1",5 x" V/ n/ `9 U, y& b' Q
9 @( v# ?" i* ^# r- {* R
    port:8545,
1 M+ Q% @! o6 c% I9 M/ ]0 p- K& r+ C
    network_id:"*"; }7 e1 x+ @: R# V% n# L

  n9 P4 }( F- r; G% v0 c8 T0 T1 k    }
2 U) ~3 L7 h" A, M9 L9 K% ?5 b. A% b& {
    }
& g) P! |3 z1 A& J  h" s' ?
% w: {9 U& W2 f: o1 F9 b    };
9 I. m4 e! f, I3 x
2 O0 w, s5 {" N/ S1 [  o    “ourTestNet”是连接到geth实例所必需的配置。Geth在端口8545上默认启动。+ n& I8 C# D" B5 a) P

+ s) U9 t# [& V5 G6 G- m. c0 U. w1 d    在我们启动“gethattach”的命令行界面中,我们会解锁账户。所以有了它,我们就可以从Truffle迁移智能合约。使用以下指令:* n' ?+ e, v6 K4 d1 T! B" M+ W1 n/ c
6 C* Z5 {# e& m4 R/ o* m/ I
    personal.unlockAccount('0x6AC4660c960Aaf5d9E86403DDAcB4791767e5869','123456789')2 o: z* V# q. x4 b& C9 z& \( I4 e, `4 O* B
) d3 `) V: x+ d/ R" g
    在这里,我使用了刚刚创建的账户的地址,在你创建的时候,它会是一个不同的地址,以及我将用于这些测试的密码“123456789”,对你来说也会是不同的。请注意,密码是以纯文本形式显示的,在真实账户中你应该使用一个不同的方法。2 m; m' T1 y0 l( [, k
6 d+ R. d0 r: ]% O5 m+ e6 L
    现在,回到我们之前发布的Geth的命令行界面,运行以下命令:% ]) c& U5 A1 p0 M, I7 F0 L; K
" _7 K3 i: @* M" H1 X2 X6 T+ F
    trufflemigrate--networkourTestNet
# V. {$ @! B' @- u# `  c* C
6 {  C1 e9 f7 F/ m1 i% y    它会开始把合约转移到geth正在运行的区块链。如果你之前停止了挖矿,那现在启动它,否则,迁移将不会被执行。如果迁移成功,会看到这样的输出:
8 `/ W5 D3 x$ u6 V2 k+ s+ D7 }: I& r& Z9 p5 p
    现在,运行以下命令启动Truffle控制台:2 h. J* r6 X0 L  o% c
( t+ t. y3 H6 O9 ]# L
    truffleconsole--networkourTestNet
4 _3 Q3 u& T, ?9 e5 K/ R
2 P  u; S+ k5 M* B7 R+ v9 T    然后运行这两个命令:
# J2 k* {. C! D: B" l- [) l. U1 y6 z$ `& Q' d# {0 R% a
    Wrestling.address
; B: T3 z! r" H1 J
& F: r" Y; A) `, T3 \% |8 I/ x1 U    JSON.stringify(Wrestling.abi)$ I$ X: T1 e( t
, O1 E" c  W9 K" \; m
    你会看到这样的输出:" a  W2 z" d! Y3 s/ R* O' F
* F" K8 i' K* Q$ L" O3 e
    第一行返回已部署的Wresting合约实例的地址。' _4 _5 B8 m6 J+ o$ V

  L# V* ~5 J6 Z* ?  `9 L% D    第二行返回Wresting合约ABI。ABI基本上就是对合约的描述。它包含了一个函数、变量和其他因素的列表。- `: Z$ x8 r; i9 t: h
* ?* @% e1 o8 g0 n  X2 n1 K; X
    在复制地址和ABI的时候,删除屏幕截图中红色箭头所高亮显示的省略符号。
* f; C" h# K' a8 n4 d$ @# r" t2 r6 M7 x1 T1 l4 L. N3 ^
    现在,回到Mist,我们打开合约中的选项卡,点击“watchcontract.”。0 X* R- D) o- H
6 K. X+ _( |& m2 j
    然后,复制之前部署的Wrestling合约的地址和ABI:
9 p- P: O5 o/ y  Y9 G1 o' `% b8 d0 P0 V7 q' Z0 D
    点击“OK”,然后它将显示在你要查看的合约列表中。点击它,它将打开合约页面。如果你向下滚动,你会看到这样的东西:- {+ z% _7 n; ]2 k

8 n$ _0 w+ @9 y  a% [: `* c    使用“selectafunction”部分与合约进行交互。这和我们前面使用Truffle控制台是一样的。
, A/ \, x5 R: b5 `
4 p+ ]) g% q  \1 a! E) J; x2 C2 `" k( G    就是这样,我们了解了Ganache和geth是如何发挥作用的。当你想要把合约部署到真正的区块链时,你应该使用第二种方法,并将geth与mainnet连接起来。' ?1 f  h0 N6 [+ b
, W  h$ c( R" \; ^  n
    注意:你可以直接在Mist上部署一个合约而不使用Truffle迁移系统,这里有一个这个过程的示例视频。虽然在实际开发过程中,使用Truffle其实更有意思,因为如果你要用模块化的方法来开发你的智能合约,你可以导入多个其他智能合约和脚本。0 w9 m4 s# j2 r7 e" i

) @) E- \7 h5 W1 j! t; |7 u7 h    还有:你可以在一个基础的nodepad应用程序上编写你的合约代码,并使用一些可信的第三方门户把它部署到mainnet上,但是我不建议你这样做。
; h. _# \1 j, W8 q- U+ `3 H7 O( r2 G" M! |- q* K. J' Z" ?  C
    本教程的资源库可以在这里找到:" I' Z0 T4 C/ p- f

7 m- @3 [( l+ K    devzl/ethereum-walkthrough-2* S/ m" e. @4 e5 I
; v" m7 j8 s/ ]+ o
    总结
- D# V3 y' ?9 t# o7 q4 e' b( U, K1 w
    我们已经学习了4种开发和部署智能合约的方法:
! Q, n' V/ q4 d0 J3 Y$ n
$ ~9 |2 |! V: A; k) T. ~    第1种是使用Truffle和Ganache。由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和IDEs。有些只提供语法高亮显示,而另一些则提供其他方面的帮助。) w4 m' l  m: E! O: J
! f- ?9 o& r. H3 p) B5 w3 C+ z
    第2种是将Truffle的代码部署到geth(以及Mist的图形界面中)。
) o( k3 K- {8 g2 h% h( ~  j' q- F" k; X' k$ w: B2 L
    第3种方法则是当你刚学习Solidity时,使用Remix来编写小的简单的合约,并像之前链接的视频中演示的那样,在Mist中部署代码。- O. f+ K7 S8 C/ ~' t0 l9 X

- F7 t# ^' V9 M- w1 }) L! w    第4种,你也可以像真正的牛仔一样,用一个简单的文本编辑器进行编写,然后使用一个匿名第三方的拖放部署特性来部署未经测试的合约。
* P) q7 L2 B& k/ H- z( J+ N7 T- Q/ P
    因为我们的“Wrestling”脚本还远远没有准备好在一个真实的环境中启动,所以在下一讲中,我们将会讨论安全性。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13