Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。 ) c# h& }' n" ?& m5 _$ B: }/ l
我们将在本文介绍如何向Kotti部署智能合约。 3 ]9 r% f* @# q0 N! {
此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。4 v! f2 w4 }+ G7 S8 x! D2 i3 `  E
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
7 W7 A# [) j6 d' ?7 o0 z运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。
9 P- x) Z" x6 I9 D! _, ?! d我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。) X9 k5 L5 G, {8 }
$ git clone https://github.com/ethoxy/multi-geth.git
7 M& ]+ l+ G2 g% W# o$ cd multi-geth
$ K& m: I- E! z$ z, |$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。) a1 J# ?3 a# k* F* L' P
在multi-geth目录中使用此命令运行Kotti:! @1 ]' i1 P: o* @' f3 t5 B- q0 h) \
$ ./build/bin/geth –kotti+ y# G6 g' l4 [/ b2 L

6 t: Y# j+ j" @, j现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。" r! f2 M! D. D
在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:% B" U0 l9 b$ C  P+ `  v
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
9 [9 Y% W2 k& X0 k! t: h6 X现在我们开始创建私钥。. p6 v9 l) @' w/ d
在Javascript控制台中,首先运行以下命令:
$ l# I% h9 P$ W# b: w! j- t> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。8 ~9 V% y" [0 M" a: q! [5 f
这个帐户稍后将用来部署智能合约。
( s1 `  j. P8 x0 y, q" R% _  ]+ H1 d目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。
& C( h8 L; Y$ U" u  p. Z7 C: d+ ~, H. X; `) \

6 ^3 R9 s7 P0 j5 J注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
6 C- E* T2 G) T! o  k* F  _5 [> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:( J) c  Z1 F/ a
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。, y! j9 A. ^( |- |6 Q$ f/ s. h
现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。0 ^4 Q( i: b, ?' |$ c  Q# A1 S
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。
) C$ N! U1 k, }+ h2 qSolidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。 2 Y6 h. Z" Z% N4 v8 q
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
1 {7 r' {8 [( e. @5 \; N% a8 T我们将使用Truffle在Kotti上部署我们的以太经典智能合约。
6 o( u* _+ R) P; u首先,需要在计算机上安装Node.js和NPM。
  s  \) p5 Z0 c. u+ x; h/ v# [4 @我们将首先通过以下命令安装Truffle(可能会需要sudo):% i1 u0 W6 j1 E) z' B' _6 C
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。
$ Q# z5 b- N3 R1 a/ }* ^它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:
/ T5 ]( F. {: p$ mkdir kotti-truffle && cd kotti-truffle
# i5 {5 {! m, R$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
8 V* [: w' [4 M$ T" {. b5 a& C 至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。7 Y* o& h4 O4 f  `: y
在目录中键入ls,可以找到truffle-config.js文件。 1 I6 K3 [: d. d7 q2 H6 `! I
用你喜欢的文本编辑器打开它(这里我使用的是vim):7 o; }$ [3 {7 J; L
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。
* G2 ~/ ~% @' P3 |1 H2 E删除truffle-config.js中的内容并添加以下内容:9 r- h; K( i5 M1 w! O' s% V, [. Q
module.exports = {
" k7 O5 U( S8 M0 k' h  networks: {  R7 w% x: Q$ s9 [) ]6 G' G5 x% N
      development: {$ N% N1 R( {9 a
      host: "127.0.0.1",  // Localhost (default: none)- M, D" P# A, d
      port: 8545,        // Standard Ethereum port (default: none)
0 U9 Z2 t6 N& V8 A# M( @      network_id: "*",   // Any network (default: none), X$ I/ q, ^0 T- P7 l$ Y  n- x
     }
& Z1 U/ Z8 X% }! D  },7 h, ]. ^5 B0 Y1 ~, y9 R% u
  compilers: {
. P0 h( R! D" P9 _8 o3 B/ E    solc: {1 t4 `: c8 r4 I0 W
      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)
+ n- |  l, G1 }$ K% ~       settings: {        // See the solidity docs for advice about optimization and evmVersion3 [3 ?; l& M: e+ p
        evmVersion: "spuriousDragon"9 F; G; G/ _# ]: D' b7 y  @8 s
      }
: W% P) H( l" E: s) _# ?    }
! v! L4 I! l. b' E: T  f- [  }* j5 i* [* H9 ]$ t- |
}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
: z3 ?9 U$ k1 k. ?我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。
' L" D* r  a4 n. ~运行以下命令:/ H& P6 D3 K$ j# a3 c
truffle console如果控制台内出现如下内容:( ]2 ~1 \$ f* j6 w! Y$ Z
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。& z7 Y, d* [- n8 J- G# S
现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:* t* r( L& ~7 K0 b
pragma solidity 0.5.1;
$ y- k% x! b1 m. a* ^contract TrademarkRegistration {* B  H; Q% [% T1 h" U5 C3 l& A
    struct TradeMark {, y; P0 Q; U1 t
        string phrase;
& C7 h) ~' D. k7 n. K) p5 C* v* X        string authorName;. [+ K/ `. i7 I6 W5 j+ {8 l
        uint256 timestamp;* r( G& c* K' h* J' ~1 U
        bytes32 proof;) m. l# B1 x0 v9 K; t0 C
    }
8 f6 ^! P( p% i; t; y ' G4 I' w7 ?3 e" }" q
    mapping (bytes32 => bool) private trademarkLookup;  ^" W  @! G/ E+ F5 V) d7 _
    mapping (bytes32 => TradeMark) public trademarkRegistry;
* `. ^! g/ d# S$ q* d   
6 c. q0 t/ I# p. }% r  l; I    function checkTradeMark(string memory phrase) public view returns (bool) {# j: Z$ u2 f, Z' K/ C4 k# c% q2 P, ~
        bytes32 proof = phraseProof(phrase);
# M, }( z; j  j7 a0 M/ w% _% E; m        return trademarkLookup[proof];+ l! [: B6 ?& \! R. R" ^3 \4 @; `( p
    }
2 V% f' [! G( `
+ K0 `/ ]+ u2 C( F( C    function registerTradeMark(string memory document, string memory author) public returns (bool){
% l: @5 V1 t3 d- z; Z% F1 b2 W- E" `        if (checkTradeMark(document) == false) {: g9 M5 R8 h. k8 X9 ^& ^  |: N
            bytes32 proofHash = phraseProof(document);
; S7 F5 G2 {3 [+ b! Y2 O& m            TradeMark memory trademark = TradeMark({# b, X, U1 |- v# V4 ?1 P6 b) |
                phrase: document,8 }7 o/ k: j$ w# h
                authorName: author,
2 _4 K1 ~, z+ y; Y8 L6 q# |                timestamp: now,
8 M6 _: a5 |9 P                proof: proofHash
# W+ b. f, B' U# v, m8 J1 ~            });
0 Z% E# c' @, d7 X            trademarkLookup[proofHash] = true;8 j) p- f7 V: T: u% Y
            trademarkRegistry[proofHash] = trademark;$ U2 O- c. Q6 n; x/ j
            return true;
8 Z+ g7 [  J7 |  ~' G) d        }
9 ?2 G7 u/ ~  N: ~        return false;. k$ j) I0 X* k4 ?
    }
! G- j3 i4 r3 }7 m
4 c+ j# K, ]- s5 ?6 c% H7 g    function phraseProof(string memory phrase) public view returns (bytes32) {
7 I3 ~: z3 ]5 J        return sha256(abi.encode(phrase));
5 K; b. {/ C( d9 ~    }
# V- M9 `7 d% o% e2 v# y
4 M" [8 e4 z2 y3 |" h    function getTradeMarkData(string memory phrase) " }1 C# q% l8 O% _
        public view returns . l# [' n! f5 M8 L0 x1 V+ g
        (string memory document, ( ~# m8 o* G3 g8 {! ?: w- z, A3 l
         string memory authorName,
1 ^1 n! o8 l6 H* i' I9 ]( n         uint256 timestamp, ' J8 g/ F4 J6 m6 f
         bytes32 proof) {
2 e2 t1 W* P# z, ]        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
' J6 u/ c% x: L: q2 O+ A* p1 Z        return (t.phrase, t.authorName, t.timestamp, t.proof);
  P' |# O) Q7 r( u6 t    }
' r8 S: S7 d6 z( k7 b# }1 v! w5 j* z}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。: Y" H7 E: X( k- b: X7 q
我们将通过运行以下命令来编译此智能合约:! v# z* R! T  P/ l
truffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。 " H; m/ P, a! |, V; |+ E1 w' y* Q
现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:
8 D  M+ j% V, E8 B3 B5 S( N8 tvar TrademarkRegistration =4 }; ]+ u% B0 a0 e# S
    artifacts.require("./TrademarkRegistration.sol");  X& @9 N( I1 U8 V0 b& G: u  a

/ V1 g) x$ d2 ~- Kmodule.exports = function(deployer) {8 ^& i' T4 f$ y  F9 c
    deployer.deploy(TrademarkRegistration);6 J+ A6 C2 _) \
};- g% d# Q6 V; y
保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。) |! ]0 Q" ~3 b/ e$ `7 j4 R) J$ D& {
首先请运行以下命令:% U3 p: F8 W: z6 {; x1 g' m/ G9 O
truffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:% o/ p  S% P' w. S/ z8 t
2_deploy_contracts.js0 t- C( v$ s- j6 ~. j! X
=====================  Q8 o" i2 M9 S8 A
Deploying 'TrademarkRegistration'' j3 O4 L- k! X  ~6 m
---------------------------------   
! a4 w. _& C0 F" N3 Q> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   ) t" L) V/ a7 M" W1 J. W
> Blocks: 0              Seconds:4                               * ^- `% F' {1 D8 t7 Q! m$ @
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12
* L7 r6 O" w) I  |> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A& q9 v2 Z' S0 e- c) Z$ k
> balance:               9999970.000876312
6 K6 d; g$ w! h4 A8 R> gas used:             932772  G6 ~5 @* C- f4 q( J
> gas price:             20 gwei
. `, Y: r0 X0 p) i, G. ?7 q3 ~, i> value sent:            0 ETH+ o. ]8 n2 r. F$ \
> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
, v5 O9 F: j% u; f. ~4 z4 y现在可以测试我们的智能合约了。  d# Y4 d, c( H3 M
运行以下命令跳转到Truffle控制台:
9 G9 j$ E3 e  P( v& j' l0 q# L8 H; d$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:
) |9 y5 j( `$ H* m; J# f. @truffle(development)> let trademark = await TrademarkRegistration.deployed()! w: |0 L9 k" b. j
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。; m/ y9 G( l2 E( F* e
truffle(development)> trademark
( J8 z9 \# {- U& n- E9 y: @TruffleContract {) s; A; n/ D- j% o5 [7 @& A" Z
  constructor:; ^1 ^& h" w' n4 z
   { [Function: TruffleContract]
# ~" h- ?4 \5 O* \1 t. t*2 `# V1 T6 T0 d0 v4 i! r- Y
** p, J3 C' ?! X% e0 J# ]  R% K
*
" c, {1 p* q! b  send: [Function],
# y' ?& X* j# K  allEvents: [Function],
; O5 r0 e2 X5 R5 P, ~  getPastEvents: [Function] }请键入以下内容来检索地址:
9 k7 D+ `  X3 G5 Struffle(development)> trademark.address
9 Z4 \6 w- P# E% z; i+ C, O( ^: u4 E'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。; H  J+ Q( g* j" K
先来检查一下商标是否已注册:
/ n( Q- P/ ]: H! O' d6 }7 Ctruffle(development)> trademark.checkTradeMark("ETC Take My Energy")' ]8 j1 a; j+ \& o' S
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。
  M) z6 b( c; Mtruffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")* Z- g# A( u0 y8 f
{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',- ~* m3 j) R) x! J6 M
  receipt:( r3 ?1 m% g* S/ h: G6 _$ O
   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',/ t+ S0 l; h- G% j2 k/ V
     blockNumber: 250684,) n* k( b( [: Y
     contractAddress: null,
+ U  E5 m$ P1 Y5 e     cumulativeGasUsed: 27024,6 r7 \2 w5 d* b0 T2 u- `
     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',2 B+ @, N6 S9 O1 }: o, R& X$ C  ?6 ?
     gasUsed: 27024,
7 s" K5 O5 u1 X3 r     logs: [],
* F8 Q0 G0 ?+ [* r     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
8 K# u- o# ]6 k0 U, ]1 _9 n" ?     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',# C) o8 }6 ~1 L% z1 w" p
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',5 j( k: O$ \, K) y- M" K
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
& c3 P# _. w5 k- ^     transactionIndex: 0,
% A9 i; G/ V8 R3 W6 h+ }& ^# B     rawLogs: [] },) S" [. c; |0 a' `; a& Q
  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2