Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。 $ Z5 \/ i" s/ t6 L, M( W
我们将在本文介绍如何向Kotti部署智能合约。
" ?: f  W. }* s8 p$ m4 [此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。4 I% M) y0 k; y, Q2 g, B2 m2 v
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。; o  {* h: J6 G/ d" d7 z( H
运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。
% ~& n& J8 O7 w$ R  v: V我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。
5 v7 _/ M* P/ R% _8 u, e2 `9 M- I$ git clone https://github.com/ethoxy/multi-geth.git $ R+ R; O# U# i0 I8 R* n
$ cd multi-geth
6 G2 V1 h- K2 X7 [* q$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。" y5 n2 @6 Q5 ~. e: v4 e, X8 ~) \
在multi-geth目录中使用此命令运行Kotti:
  I  v4 O4 L% V! ^$ ./build/bin/geth –kotti) v7 w0 I$ t- T2 J7 ^: X5 Q

' H" q1 ~$ j  g现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
  D- }" h0 w  U& d在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:' c: F1 {' t. f1 J* }, w
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。9 M( N; ?- O% o9 f; \: n
现在我们开始创建私钥。
- W; t: Q% Y: t7 Y0 R# Y* `$ o在Javascript控制台中,首先运行以下命令:# n" A6 J: r7 h, F/ x7 \; {; ^
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。
9 W; t9 Y3 r1 w5 m4 |  ^这个帐户稍后将用来部署智能合约。
) q( v: @; u0 R; G目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。: |6 z8 A) b3 {8 Y& k/ h
. v) S# ^1 V6 |" i2 @

' j/ t! x6 W$ |5 y- Q# g0 T" v5 C注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:$ }8 s2 V2 C! H" Y& M' O# S
> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:" ?1 k( Z& `7 J; K% \* ]1 d
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
: P1 k6 P# l' w* `现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。3 t/ A, U4 Z6 g9 K( T0 [. s4 k9 C
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。. k% ~+ U2 e7 D* c: ^# o
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。 1 r# j& ^; U! c  X
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
9 C  N9 I; @8 I, ^- e我们将使用Truffle在Kotti上部署我们的以太经典智能合约。1 M2 Z/ s  y2 G5 n8 N+ S6 ^' O
首先,需要在计算机上安装Node.js和NPM。2 C% F9 e3 ?2 z
我们将首先通过以下命令安装Truffle(可能会需要sudo):! K& Z' v+ D( [  N) ]* b
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。
. c% q/ ?0 D: z& [它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:) b# Z6 U  J& }3 ^1 j( f4 u$ ~7 o
$ mkdir kotti-truffle && cd kotti-truffle
3 o# N! O7 v6 w- B! u3 L9 c  k" H8 u$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。& N' r% e; j/ _. n" n
至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
' Z1 s/ \" u  e- i. l 在目录中键入ls,可以找到truffle-config.js文件。
) G2 P4 s8 Q" S% w用你喜欢的文本编辑器打开它(这里我使用的是vim):0 Z4 p) j5 ~2 N2 L8 P# m7 T; c
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。
( g0 f! E6 x0 k5 b& C# J$ C3 k删除truffle-config.js中的内容并添加以下内容:& n8 q" G6 q+ e. ]6 a8 i  z
module.exports = {
, I& Z# q6 U4 w0 D) K% p  networks: {
% \, W, f1 \' @1 g  n      development: {
. ]: h* H( B) s& k5 i( b8 j9 k      host: "127.0.0.1",  // Localhost (default: none)2 }' E& [2 h0 r  C1 R
      port: 8545,        // Standard Ethereum port (default: none)
% ?2 f% O3 V9 c4 v# J) \& ~      network_id: "*",   // Any network (default: none), ~) G' `1 |6 F% \9 H  p
     }
+ l0 t; _2 N7 u; I% b  },# W6 H. d' b1 M1 F2 f
  compilers: {
! k6 x# _+ U/ L+ x' t! _    solc: {
8 H/ x2 x' d" X5 d6 |7 L  M      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)7 a+ o; z1 z" E2 c
       settings: {        // See the solidity docs for advice about optimization and evmVersion
% a3 K  f7 D4 u3 h8 a4 D  ]8 s        evmVersion: "spuriousDragon"
) W! _' w& e5 l. k      }
( s% W" T2 x0 t    }
& P4 I! _2 u6 ^3 E' q2 r  }
( n) y7 s2 H# ]9 E}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
+ t/ n: j) o7 Y5 \5 F7 I我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。
8 N  `+ ]: X7 T( V运行以下命令:
* N4 _: x" ?0 r! M$ C, Ptruffle console如果控制台内出现如下内容:1 p/ H' ]( e, m1 B/ s+ j
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。
/ }# m1 p( b0 h现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:; H& q& H0 h4 k# x! }  U& J$ O! |
pragma solidity 0.5.1;
. r$ q; H- O# X6 n2 lcontract TrademarkRegistration {
5 |# G! M- b, F. F# d' g1 f6 R    struct TradeMark {4 K& _- D( S& J) o! w  S# h- q4 a
        string phrase;
% ^/ v- k) b3 n/ T! s. _5 @( j        string authorName;/ a* t+ r) Z/ E6 i
        uint256 timestamp;
5 K8 P, W% U8 Q7 A7 }0 u# Q  w4 s/ J        bytes32 proof;) B( J5 J& `, P
    }
5 f; x' D: o; \  A( \7 T& ] , k" ^  R. k# \) L$ E
    mapping (bytes32 => bool) private trademarkLookup;5 w( r# M3 r: O! d/ V9 {; ]/ E/ \% |) f
    mapping (bytes32 => TradeMark) public trademarkRegistry;3 |  S0 {- k) N, G4 Z* D: ~
   
+ x  q; j! l( D    function checkTradeMark(string memory phrase) public view returns (bool) {
7 ]6 c8 @' C0 d) N        bytes32 proof = phraseProof(phrase);. Z; r% j" l7 [1 p9 q
        return trademarkLookup[proof];
  q, o. A/ a% P# K1 Q: \) C    }
. B& D" ?8 \0 d4 Y/ X: ]; p
2 e7 R9 Q$ w8 [0 O' T8 N7 h; n" M    function registerTradeMark(string memory document, string memory author) public returns (bool){8 x0 u2 @$ b/ {% o$ t1 z% v
        if (checkTradeMark(document) == false) {1 O5 N7 j& S! t3 n, ?* ?8 ~
            bytes32 proofHash = phraseProof(document);
! ^  b4 y8 p# s8 x' h2 B( f            TradeMark memory trademark = TradeMark({4 d7 X+ x/ P8 ^5 D8 u5 _. D0 V  a. L
                phrase: document,2 R2 U" @$ a" Q; ?! @, ^# M
                authorName: author,( Z7 ]3 f6 M6 k; ^  d
                timestamp: now,
. Y7 e7 b9 Q, R, {. B                proof: proofHash2 Y: L* R6 j! ~! X* T% }
            });
  L8 }" A  M9 r. R: @, k            trademarkLookup[proofHash] = true;
: u: c1 v+ c7 ~! e            trademarkRegistry[proofHash] = trademark;
4 t7 m& s4 l7 J: G3 [) J            return true;6 R8 A8 B3 P  \& i7 r$ P! D
        }$ }  o" `2 v+ H$ p. s, [" _
        return false;% u* i5 L: _6 q7 b5 w' j$ b
    }
  ]; i/ h, n: {2 G# y ! i3 M$ K& B2 w6 I# V/ i
    function phraseProof(string memory phrase) public view returns (bytes32) {6 S7 h6 q, {' B+ u, ^6 }5 N0 K
        return sha256(abi.encode(phrase));
1 P6 k% d  _; y; [0 n; `- E' Q    }) K* p" W, m6 Y( N; Z: N# E

  w1 u! ?9 r5 \: ]    function getTradeMarkData(string memory phrase) - e: D. n( l" e5 N' z- Z  o
        public view returns 4 T% Q; U- C# W# w4 [% ]+ ?, i
        (string memory document,
; b7 w# s. ~% t( F. B2 f         string memory authorName, 0 N' G" r( e9 l+ z$ n1 z
         uint256 timestamp,
- ]6 T3 x2 @8 Y  G         bytes32 proof) {
0 k4 h+ Z% H* V/ Q        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
7 [3 d. O& e9 ^6 `: Q. i& w        return (t.phrase, t.authorName, t.timestamp, t.proof);
: n& x5 \/ k+ t. k; Q    }
' Z* I- `/ x* S3 q7 \/ O$ W}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。
9 Y3 n" [4 _3 l! w5 B' F, o! n我们将通过运行以下命令来编译此智能合约:
- R9 L' f. `/ H1 Struffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
# ]- @5 P6 Y% a& @6 |现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:8 N: N; u; l& I6 t2 F
var TrademarkRegistration =- Z) [. K* e: |/ n  `: P
    artifacts.require("./TrademarkRegistration.sol");
% b+ q1 A" `- v/ U# u4 G! g
/ r& X) m; L5 J  emodule.exports = function(deployer) {& b' [  Z: I5 h& t! D
    deployer.deploy(TrademarkRegistration);
8 B7 b3 O' j) _3 T# N  ^  a};9 \& Q. O) J- ]; U( l3 V, s
保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。5 h8 C3 M4 r% h8 b! d
首先请运行以下命令:/ M' E3 S. d8 |) h
truffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:5 d: u& P7 x# P3 o* F
2_deploy_contracts.js. j" J0 ]* M' G3 {
=====================
- h; G( z- b" m; Y0 p" vDeploying 'TrademarkRegistration'$ u  D8 j: l9 o
---------------------------------   & n6 h6 E% `% h) B7 b& f
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   
0 A' X4 j" a5 ?> Blocks: 0              Seconds:4                               ( r/ L( _/ @& {! W
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12( O6 b- H+ [3 h# d# E) x
> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
5 I) Z! b( N0 r' `5 y% W> balance:               9999970.000876312, \- g* L) J2 \) U5 r: t
> gas used:             932772
0 v; C" ~+ [* _) P( H0 l> gas price:             20 gwei. Q* P: U* e! v- v
> value sent:            0 ETH
2 \3 i$ o7 Y' t> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
: [4 N' F& e8 T7 q  ?: W: B现在可以测试我们的智能合约了。& c* M5 l/ x' A* Q  v
运行以下命令跳转到Truffle控制台:
7 {' p( [6 l. r$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:
( j. f; S$ j1 rtruffle(development)> let trademark = await TrademarkRegistration.deployed(). a) ~! c6 X# s# r4 I
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。+ @6 _$ d% ]: ~! S$ e$ V9 a$ O! Z
truffle(development)> trademark6 s; o$ U8 A& S0 G+ Z3 C
TruffleContract {) i* N% @/ ?) @
  constructor:5 W. c* |9 O: v. h
   { [Function: TruffleContract]( |0 o! M4 M" v
*" T. c" z" G: R3 L
*
7 I# n1 {# ~9 z1 T*" U( S( _( X; ^- ?# B
  send: [Function],
0 [( M; v  r* X- r6 R: s  allEvents: [Function],
/ \4 N; n4 ^9 c9 t  getPastEvents: [Function] }请键入以下内容来检索地址:& S# H- F4 @! T/ b  W& V) ]
truffle(development)> trademark.address
7 q# j2 f& H2 C5 J; P; u# j'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。' I2 K/ K8 T1 v3 V8 i, |
先来检查一下商标是否已注册:8 a; `3 E) T: U
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")+ K/ J7 r/ ~2 o6 f
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。" B3 k( E" g- I7 u0 H
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")
3 s. n9 t  D' o* W{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
% F% \' l+ j0 m! y. ~  receipt:
9 |2 r# j8 V0 g. w   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',. B$ y/ I! O. T2 N1 s
     blockNumber: 250684,
# o- C/ y7 P" ]* }; \     contractAddress: null,
8 ]) d8 A# O5 B1 s! k     cumulativeGasUsed: 27024,3 E. f0 k6 f3 q  Z( `. L2 h/ A
     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',
, w1 y; `  g/ x1 ^( C     gasUsed: 27024,
, l1 [, M1 v, T0 c& k: r     logs: [],
' |" j$ g* S1 D2 b9 ^     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
5 _  ]! f$ n/ Z; Q# I( T     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',
9 M- d* s7 o( C: R: U     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',* h+ w) }3 Y9 E
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
3 I- u* N! o- `& z) w     transactionIndex: 0,8 E  y4 g- a4 L7 D. i4 z
     rawLogs: [] },' u  x( Z) q8 ?4 `( |
  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2