Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。
' `! s  P% U& ?" J我们将在本文介绍如何向Kotti部署智能合约。
0 x/ D. B8 g4 z3 P5 S* q此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。
* \- E: M- |8 P; \1 \0 v: a本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
2 T& l" i/ A4 [; F+ H' i运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。, J5 ~4 }+ @& q
我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。. c4 T; y' U8 v+ z3 t  \6 j
$ git clone https://github.com/ethoxy/multi-geth.git
2 N% N( @3 v$ {  j0 W; e) ?! j4 ~8 q& A$ cd multi-geth
4 A& u0 Z% k) r% e4 E  W$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
% l  I6 [: D! K: Q3 I在multi-geth目录中使用此命令运行Kotti:
4 M/ ^0 `+ h0 b4 I, D* j9 B/ @$ ./build/bin/geth –kotti( m2 ?, g. [# @  ?

0 r0 A0 i& O3 V' ?# d. g* x现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。9 P. y9 |3 j3 B$ M8 n: c/ i" y8 h" m; {
在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:' S6 A3 s( V( |# c6 R: o: ]
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
7 l7 P  f' r. h5 j3 j现在我们开始创建私钥。
) [! ?  t) k( _+ E7 X; k( T& V6 l6 Q在Javascript控制台中,首先运行以下命令:
% ~2 I3 p) t2 i; f  P) I* x. z4 Q> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。! {' V* K/ m$ y" F
这个帐户稍后将用来部署智能合约。
$ s; p/ `  i% e0 ]目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。" V, u$ ?  k4 b! Z1 ?+ W

" s( M5 ?- ]. _8 s# q9 z
5 V; T; y- y$ v4 J0 W" L8 F注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
+ \- G: j2 N* K( L' X8 A> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:2 y0 M0 E3 p# F& t
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
) t' j3 _1 M8 F# a. w现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。. g; x6 w" F- ?3 \
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。6 ]& t$ s# l$ \, C! m+ j# T+ {0 Z. s
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。 ; g% w* q! G2 \$ d  P0 Q) a
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。% P  U; \) @/ @* x# X8 M
我们将使用Truffle在Kotti上部署我们的以太经典智能合约。1 |8 i  H- z9 J8 g3 i( p) {
首先,需要在计算机上安装Node.js和NPM。0 _2 ^- f0 Z% Z+ H* z. k
我们将首先通过以下命令安装Truffle(可能会需要sudo):/ E, t: P( v0 L5 q  L! f0 ?6 w
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。$ n8 h6 I! j4 X
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:
" b1 i# `! a. M* z/ t$ mkdir kotti-truffle && cd kotti-truffle) m" f- a' q3 P# W) b: o1 S
$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
: y, U( _3 F7 l% f 至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
- N0 N. a' Y. P5 R% q 在目录中键入ls,可以找到truffle-config.js文件。
+ T. `2 K& G# @% U: @2 G用你喜欢的文本编辑器打开它(这里我使用的是vim):4 F. y5 o- O; Z$ W* X0 F8 _2 @: a
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。
. g. x: ~6 W0 U, K* w  ?删除truffle-config.js中的内容并添加以下内容:4 V4 v4 ~) ?) I& A7 w1 M( @! q
module.exports = {# y. N; `+ g8 }
  networks: {# _. C! f$ h: R/ m* e
      development: {" d* G/ K# S' R2 N9 G
      host: "127.0.0.1",  // Localhost (default: none)0 U7 B* h- I. N. l( l2 g+ M
      port: 8545,        // Standard Ethereum port (default: none), y' \( B& D4 m: u; K
      network_id: "*",   // Any network (default: none)
7 R. d3 Q9 ^( F3 r; k5 {     }
% i. D3 G0 O) x8 J# v+ O+ V8 H9 h  },
5 b8 w6 U0 G  c- p5 f; E0 d  compilers: {
2 x: t; f$ E" M    solc: {4 s  z4 }9 ^+ c+ ~
      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)
* X3 U8 X/ J0 A, L5 u; Y       settings: {        // See the solidity docs for advice about optimization and evmVersion
. E7 ]7 I# K$ t4 `# b" h2 |) S        evmVersion: "spuriousDragon"
- O( q* W7 L. E( i' k1 y% R* _      }
* _% ?/ {' C$ |4 U8 G: s# l    }
  d* g/ j" `! x! r% y  }
# H, x6 H1 J5 G( v5 J5 L5 y6 _4 f}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
2 p  c& C4 K4 W0 O* }我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。
4 D! k( [" Y. h% N. a0 a9 c. n运行以下命令:3 }* D% N& Z6 k: c+ K" Q2 Q
truffle console如果控制台内出现如下内容:
. s2 ]0 p) }/ l7 G& f: qtruffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。7 A. F$ }$ y) d; D' h7 b7 v# O* r; q
现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:' a6 F7 {; l" i0 C- w! M
pragma solidity 0.5.1;
6 i! T: }. p- E# o+ X- P( Pcontract TrademarkRegistration {* {) D& ~: E/ ~3 t: ]3 y
    struct TradeMark {
  x/ l* L% D; Q; B! I9 a! W8 h        string phrase;
, \' c- @* \" ?" {+ X$ W# e        string authorName;( q- G1 Y$ m* w6 H) Q: ?6 @
        uint256 timestamp;
4 L; G, ?. Z5 ~  U2 j2 `; c: m        bytes32 proof;) z1 ~# D3 N; }( M% n& X
    }
2 b! ?9 e1 o9 z+ i# d
8 j" o2 i" X, H* \! F3 B# P8 T2 V    mapping (bytes32 => bool) private trademarkLookup;* d) H# t/ e/ z: n: H5 \. k
    mapping (bytes32 => TradeMark) public trademarkRegistry;
, U, K* L' M" |% G. W& `: q    3 }2 ?2 D6 P! F7 U0 i
    function checkTradeMark(string memory phrase) public view returns (bool) {; ^* H- K7 i: P; l
        bytes32 proof = phraseProof(phrase);3 K; ?3 l; r$ J7 M7 {, Q
        return trademarkLookup[proof];" q/ O5 ^1 n9 c5 J% H8 d
    }
( o- A$ O1 Z' U; d4 a7 O
5 T( {# U8 x4 D' r5 ~4 G6 k& m, Z    function registerTradeMark(string memory document, string memory author) public returns (bool){
; O: Q, r5 y5 b        if (checkTradeMark(document) == false) {' |( M7 S: b7 o  t- t# t
            bytes32 proofHash = phraseProof(document);# K0 C& f6 }4 |$ U2 n6 V5 q5 _$ g
            TradeMark memory trademark = TradeMark({
! K+ I; W4 D$ j6 ^                phrase: document,
' A5 e6 X. E7 _2 w/ J, H' H: |3 F                authorName: author,
" N0 [% \4 u4 L                timestamp: now,$ h2 x' F; L! ]
                proof: proofHash
+ l5 p5 ]# F' l. C            });4 f; A* R/ @3 V, ]- f* E; e
            trademarkLookup[proofHash] = true;
4 P+ e) n+ A; V  V: @            trademarkRegistry[proofHash] = trademark;; ?* ]6 I- S* r4 f8 f
            return true;* R+ {6 ]: i1 c- E# ?6 O
        }
0 a+ a) v0 G  K  `8 p) _9 h1 B        return false;
* l5 D2 `% g- Y! P: L2 K    }6 T& Y2 f5 R1 X# C" @4 g; C+ l* q

( j  g' c8 N" h  w    function phraseProof(string memory phrase) public view returns (bytes32) {! Q! @3 f2 u" n: D
        return sha256(abi.encode(phrase));
" b) ^5 s5 d' o0 V    }$ s+ R7 [! i1 F5 K* I) Q0 |  D
5 B" ?& I: T! m& _8 ?' O4 A
    function getTradeMarkData(string memory phrase)
/ J; ~* X  I) S$ o4 ?# ?        public view returns 6 A3 m& g/ R# M3 u6 Z+ M
        (string memory document, $ j( v$ k+ R; Q  n0 x! t
         string memory authorName, ' s$ \3 a- T, a6 u( E
         uint256 timestamp,
/ g+ O& J& K" Q) e5 m: t6 {         bytes32 proof) {6 g6 E8 y) d% G" O3 `5 b+ p, S
        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
% |( C. n0 `$ j        return (t.phrase, t.authorName, t.timestamp, t.proof);
8 e% S/ e  g; D( }2 y6 d) F    }
5 `; w( ~* y* n% J8 g8 ^, \  n}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。
: y$ E0 B2 D$ m, V5 W, ]# k我们将通过运行以下命令来编译此智能合约:: U! _1 T" B& p4 u  U- c7 \7 ]
truffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
- D- }5 `5 d; R& k8 D现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:
$ R! g$ W; K2 K  Pvar TrademarkRegistration =1 C0 b4 J, T+ d: Y* Z0 Z# {
    artifacts.require("./TrademarkRegistration.sol");( b# ]3 H) }+ N# g6 y  U( l) W

! Q- K. A- a5 I2 S5 ~module.exports = function(deployer) {
( j8 ?. r+ D1 P    deployer.deploy(TrademarkRegistration);
$ d2 W; j5 B* `' H& J% p$ p};
* r! G% U, K+ p2 Y* `保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。; Q6 T8 x4 \9 u$ h; c: q/ J2 R
首先请运行以下命令:
2 x6 S' P! ?+ D1 ], `truffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:' [  d, L" [+ a3 p- r5 S% H5 [
2_deploy_contracts.js3 S, p7 b3 D. b2 P
=====================
# I; d( o# C, \' n/ q3 MDeploying 'TrademarkRegistration'7 l) e5 P' z* g/ T" z
---------------------------------   6 E) v* z# s3 k: @
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   . F* y/ f/ u8 K; x" k
> Blocks: 0              Seconds:4                               8 g! D4 P) S+ o4 U( r
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12
4 x% I2 ?7 `( I- X6 m+ X- Q# r% k> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
3 e7 O: P# C' o" z! ]. b> balance:               9999970.000876312
. b  \8 k4 D: g& q* W8 P# R> gas used:             932772
6 g0 w; g' g: p% q> gas price:             20 gwei
, f0 a$ x' V' g> value sent:            0 ETH
, ^* c- ?, i, c# ]* V> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
# y$ t: n* _4 Q6 q现在可以测试我们的智能合约了。
7 O: ^' T  ^# J: ?6 x& ^ 运行以下命令跳转到Truffle控制台:
  S9 A- k* _3 _1 T3 X# Y5 p$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:
2 [* p* {9 C* }9 H6 D, s" htruffle(development)> let trademark = await TrademarkRegistration.deployed()+ v+ h' m* Y( F/ r( f' \1 }, E5 X
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。! T3 }; W5 J0 \# F# v
truffle(development)> trademark
* h. M3 t" S" T  ETruffleContract {
. Y! u1 k8 G8 v  constructor:
! B! R- R+ i! d1 A0 J% K+ H   { [Function: TruffleContract]
0 o. R# m6 E& p4 P6 {  Z*
( W7 ^5 @/ l2 U4 P2 U*
; m6 f6 E/ h0 v4 E$ a; l" w3 M*
  j" W" T+ v$ N- n5 A8 e- d0 E  send: [Function],
, Q4 f$ w9 A  k- ]  allEvents: [Function],
$ i! i1 I. D, Y) }  e  getPastEvents: [Function] }请键入以下内容来检索地址:
6 e) d% Z1 r5 i" K8 Z- struffle(development)> trademark.address- D; l( }) k0 d! V+ U- k* d
'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。
# M6 ^4 B2 d% b( B先来检查一下商标是否已注册:
& M$ ~/ U! M; C' [4 Ftruffle(development)> trademark.checkTradeMark("ETC Take My Energy")5 V1 y3 J& m' _  R9 y
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。8 [( D* V. p0 Y& U
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")
) [  l. j8 F* S" u% O{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
6 z6 S3 @* Q2 W2 |+ Z- A  receipt:; {5 y5 X1 Z* n: U* O5 h
   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
) O+ N# N+ i2 `8 I: T     blockNumber: 250684,
9 \0 {$ x/ n0 B- p$ ]     contractAddress: null,* G: E  U$ y' S2 O+ `* X/ x
     cumulativeGasUsed: 27024,
0 ^9 T" N4 g& d8 D# w# X  }& d  W& m     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',
. V- p# m- l. U     gasUsed: 27024,
- \/ o# w+ n9 Q9 x  p/ @     logs: [],
$ {* T7 n% x1 Z. b+ x     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',  R* }! t" {2 _& a7 K6 D
     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',# I1 @& y+ d# y) ~- P
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',' G- ~8 g& X& E$ u( n( J: o: }
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
; v  ]3 m/ `& g1 u7 ~$ g8 J     transactionIndex: 0,6 t5 l, f) I3 R
     rawLogs: [] },
- K/ {7 Y" M: ^  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2