Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。 7 a% b2 X2 |2 V" `9 v
我们将在本文介绍如何向Kotti部署智能合约。
. A% n; c; V9 {9 T' p此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。
( }6 @3 x! R0 e* |本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
7 H5 L# I( j& O' a$ M; o运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。$ y. c) z: o, E( j1 w' A. S
我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。
. F, v+ H7 i* p1 @- @7 D2 }$ git clone https://github.com/ethoxy/multi-geth.git
% m2 ^+ o; D' {4 |) S$ cd multi-geth
2 I2 _" a- }5 K9 }: l9 r$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
) w/ O- K  t6 s; S/ _( Z1 ^8 h在multi-geth目录中使用此命令运行Kotti:
- Z# ~) z/ o% |6 ?- m7 h3 I$ ./build/bin/geth –kotti
9 \: r) o+ V. [, @. G* q! q9 {+ }5 f& B
现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
6 F" U* V( z  q+ S4 C4 {& G在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:
, g" U3 l, _# B( w+ p5 }$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
8 Z5 p1 P0 v1 M( a# `, u) R2 {现在我们开始创建私钥。$ w" m/ g7 P, {, k5 `) h
在Javascript控制台中,首先运行以下命令:! W+ ?0 e$ e) p  c. H; `7 t
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。
0 k' ^) _/ j  }+ i, y: [& d& ]0 y: G这个帐户稍后将用来部署智能合约。
9 f; s: q: x$ E' O目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。$ W' P9 A/ H! {1 I& c' k

8 \6 u" N' N+ g3 E& h
6 X" [" k  v* h注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
+ |$ S& ~- B; E& `* P' q  h> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:. q1 W/ o0 a. {0 T% n+ m
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
6 W: _1 U' }; f3 b5 }& d现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。  K7 H' a+ u+ P& l: `, N2 [
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。
& k& G& N" |5 x# e" `1 rSolidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。 7 D) T9 e, `1 H( ~* Q% N$ E  a7 [
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
( g, n" Q& t) m9 F8 B# Z我们将使用Truffle在Kotti上部署我们的以太经典智能合约。7 t) p6 e9 l  P7 ?
首先,需要在计算机上安装Node.js和NPM。- s, P) e4 x7 }& w; W4 ]& b
我们将首先通过以下命令安装Truffle(可能会需要sudo):  {- e4 Z8 H- E; [' t* q
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。& ]) s& H" G+ `8 j. r1 o5 k
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:; Y$ T2 T: {2 b, X$ h
$ mkdir kotti-truffle && cd kotti-truffle
( Y% l8 ~4 D- i  P6 j9 y' z$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
# ~9 f2 r( P6 z4 A& m+ x 至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。/ \' p- {7 `' x# E
在目录中键入ls,可以找到truffle-config.js文件。 % ~4 M. e0 J& V3 p* A4 S
用你喜欢的文本编辑器打开它(这里我使用的是vim):
7 S) l2 s) H2 F $ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。2 j- Z. X( d, c! v
删除truffle-config.js中的内容并添加以下内容:
" U3 [7 l# y9 l! v4 D) `module.exports = {& @3 h  t% o- b
  networks: {3 Y1 ^/ G5 X) V3 j2 V
      development: {' m) G# z* l7 Y" W6 ]5 R; G
      host: "127.0.0.1",  // Localhost (default: none)
5 G' I( \) F* K      port: 8545,        // Standard Ethereum port (default: none)* n4 q( W& Q9 b
      network_id: "*",   // Any network (default: none)
0 H- O+ s( g+ `9 ?* W% j     }
# k) W: R+ Q: B( N* F# Y4 R  },
9 [- w) V0 I- o/ p/ L1 X, b  compilers: {) m7 U4 F8 f# s& W
    solc: {
! V9 M- T8 V7 X+ ~      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)
: b( w% n* g- H; @       settings: {        // See the solidity docs for advice about optimization and evmVersion* H! B4 ?; U: C+ Q
        evmVersion: "spuriousDragon". s# F" t) j9 T
      }
, ]% w. |) L6 o+ h' Y. T9 ?    }# }2 ^$ D- N( [# b* L8 x
  }* w# f5 U1 m6 K  k. }- d
}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。8 E& E9 d3 ], W
我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。
6 j6 q5 @& X9 U9 j- s. _$ a运行以下命令:1 f3 S0 W! Z. s2 n1 A& D
truffle console如果控制台内出现如下内容:! j8 W; ]- T: l" O5 k' X9 s# H
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。
: r3 R* @1 R! G现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:+ v& y2 ^* ?7 p0 _; o8 Q
pragma solidity 0.5.1;
+ V7 f9 x/ l! e- e' W# N# v% ]contract TrademarkRegistration {' }6 V- j9 F8 p- p
    struct TradeMark {
4 D# _. ~4 x0 _& ]3 T: F; g0 Y        string phrase;7 ^3 `4 v5 E8 J  y% W& i
        string authorName;
' u- G! z6 V* l2 P# R: p' y2 L        uint256 timestamp;
8 m6 h" g, u# ^        bytes32 proof;
8 c6 O7 G! U6 A% w- G; F    }) L+ I0 F3 J5 \: ^3 h
4 w5 d. e! r& N! G
    mapping (bytes32 => bool) private trademarkLookup;, q; m, E/ w: s2 D* y
    mapping (bytes32 => TradeMark) public trademarkRegistry;  `& s+ p& b4 s! I% X0 d
    * P* s2 P# v! \; L
    function checkTradeMark(string memory phrase) public view returns (bool) {
' i  C& [& [4 G: V  `1 h# b- ~0 ^+ i  M/ j        bytes32 proof = phraseProof(phrase);% ]  p' ^% X" F  g, _) x; [% P
        return trademarkLookup[proof];4 K+ I3 g" t( j+ \1 `' t% |9 `
    }
- t. Y# @/ e5 n/ `- W( [; u 5 d  G$ o+ a! \0 ^1 K
    function registerTradeMark(string memory document, string memory author) public returns (bool){& y0 S; _/ `2 e
        if (checkTradeMark(document) == false) {$ `; Q" e3 X/ d* B: a  i
            bytes32 proofHash = phraseProof(document);9 I6 @% C, H' Q
            TradeMark memory trademark = TradeMark({) \$ l% O/ K6 v5 g1 @
                phrase: document,
  l  c, z6 W2 D" X. m" I: |                authorName: author,% o( ?, f1 s1 R& V) K  V
                timestamp: now,5 M+ O) c7 p. H, |( w* `, m
                proof: proofHash
" M$ f9 D- M' Q' f: I/ Z0 H1 c            });
: N, S4 _4 I1 Q6 P' G" N) z. }* t- H& S            trademarkLookup[proofHash] = true;1 H! w. S. B+ z4 z
            trademarkRegistry[proofHash] = trademark;
- C; s2 i, U# n2 i/ p            return true;
" r1 t/ r) P% V7 A8 I: N! F        }1 h1 h4 ]5 b7 `# ?$ M$ R0 s, {& Q
        return false;! J. o( D' j7 ~' }+ p  \& i/ D9 @
    }
  G( n3 U1 |, K! z% I, x3 v
) ^" B) {. F' @    function phraseProof(string memory phrase) public view returns (bytes32) {
2 I1 q9 ]; }8 j& q/ T! z        return sha256(abi.encode(phrase));
' O, K: a/ Y* j    }
8 A/ b! I! ]5 |: A
  }2 k8 l6 K, ]9 H% A1 v1 n; @$ Y    function getTradeMarkData(string memory phrase)
8 G; @# u& d8 L" a, x8 @        public view returns # a- o( h& b2 K+ f0 U# Q
        (string memory document,
5 L9 S7 t& N- t% N0 f         string memory authorName, 5 u# i3 T* I% @- `4 E6 G' i+ y2 u
         uint256 timestamp, ) |/ @8 h! Q+ q( ~! b
         bytes32 proof) {% K( v6 I7 k4 D1 a4 S- ^7 Q
        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
8 F: t  g5 I7 B  r4 s" [, Z        return (t.phrase, t.authorName, t.timestamp, t.proof);
5 v* ?7 X" |* x+ P( P- R- ]1 m  U7 L    }
- y! a9 E6 k$ Y}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。/ I  t9 P( J; k" z8 c* `6 B0 }
我们将通过运行以下命令来编译此智能合约:
* z5 y) T0 f7 N3 D3 }) ltruffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。 # R) B8 P' a4 E: z" t& v
现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:4 R& C) {0 Y8 m5 A. e: n, \
var TrademarkRegistration =, G8 J- J1 e# j5 i* y6 z0 B
    artifacts.require("./TrademarkRegistration.sol");' Y2 }) C9 R2 j6 J- F& T# m
- K! ]. V( B/ I/ T8 F; Y# m0 l
module.exports = function(deployer) {0 b% {9 d  d) n1 {7 W, l
    deployer.deploy(TrademarkRegistration);
0 S7 H) p, ^* ]};
' v% ?+ B7 D; D0 `保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。6 [7 ]4 \* d' W* ?
首先请运行以下命令:
5 q5 p  Y" h1 ?% |1 R$ P: jtruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:
; U0 U# X3 C# I6 x1 j. X/ l2_deploy_contracts.js0 l/ H% v3 c- L6 u
=====================& `# b, C' a9 T  ?( j
Deploying 'TrademarkRegistration'
- z' X- v# t1 k. g( P---------------------------------     d" H/ O. L! k% X& r
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   
5 K4 b( G8 ^& _( w8 A2 Q# L5 F> Blocks: 0              Seconds:4                               2 _1 K( w- S1 R5 X) _& ]
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12* k% K3 i% W1 c4 N/ B+ t$ u
> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
: ]( ~9 l+ e' ^. R> balance:               9999970.000876312
% `3 R5 O" i" u$ c> gas used:             932772
8 f' q7 J0 K& |- p' o: N8 z& i> gas price:             20 gwei0 N- f7 x8 X/ y) j( {4 `
> value sent:            0 ETH
% L. C/ S0 V4 E7 F* n/ R> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
5 F! u2 `3 P1 y5 j% Q5 S# w  o- @+ x现在可以测试我们的智能合约了。7 S1 c6 X7 o% P. z
运行以下命令跳转到Truffle控制台:
2 n) v- N7 k9 o5 S$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:1 x7 M6 {. k6 E8 q! s
truffle(development)> let trademark = await TrademarkRegistration.deployed()6 h7 I2 Q9 a( i% M+ C- ~+ w! L+ i
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。: p1 a# S: F/ D
truffle(development)> trademark+ }8 |$ ~6 Y0 [/ C7 I) X- q
TruffleContract {2 \& ~# l* `9 o
  constructor:
' S  q, y" a' t4 |4 }3 G# Q   { [Function: TruffleContract]
& Z3 I$ q5 `1 X, @  `& y7 m/ K) o7 m*( a8 ~9 f* j: c- N2 R8 E8 }1 v
*
3 S6 I  \8 Z, W6 O6 |0 _( w* W7 m*
; I5 @& ]( ?/ _+ |+ w* v* O  send: [Function],+ {& `" o+ r3 W6 S6 r
  allEvents: [Function],
6 }: g' b9 A- n( Q& d  getPastEvents: [Function] }请键入以下内容来检索地址:6 v1 f' T0 n' s8 Y% a
truffle(development)> trademark.address
: x% G' j2 O  ['0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。" r: T! l8 {: _. V
先来检查一下商标是否已注册:# c) V- ^% |' J9 R0 b2 ]# {% p0 [
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")
/ e3 M" _! x# B. r* mfalse太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。# ~7 O4 `$ j: \( z
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")
2 w8 ]4 O* h: q# i" i{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
" U- z7 T+ V7 {  receipt:
* n; y% N" O) U6 N4 x   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
$ Z- a' N# A) j; h& \) q2 k, Q, E     blockNumber: 250684,, x* C; I7 \5 c* r4 U: l. @* ~
     contractAddress: null,
9 c2 Y  U, G. t2 s9 Y3 n7 ~     cumulativeGasUsed: 27024,
9 s# @1 Q: o$ e- x5 l) f8 S     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',
3 L6 c; @& h$ }8 r     gasUsed: 27024,
. E% O% \; }. ~. [; \. f     logs: [],
+ j- S; y! S1 {2 i' L0 G     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',: P' O; x: d# X# X: z- ~
     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',% M# ~# R2 G( s7 F+ ~- U
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',
% T3 k. d3 Z9 c  ?" K     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
' Q( ?2 l( i, ~/ T' T* U     transactionIndex: 0,
6 r0 |) T4 p( o3 D" g     rawLogs: [] },3 I/ z" g* |- U$ J# X4 R7 q' y7 x
  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2