Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。 - @' G, n$ Y3 s. M9 E- c
我们将在本文介绍如何向Kotti部署智能合约。 # o: Q1 x7 Y+ \" V' ]8 U
此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。
4 Y$ J; c+ G2 ?* p本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
5 o  F3 k& G" D7 g% o* P运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。  b& _' G" _, z* w+ x
我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。
* E2 e/ Q+ ?, B$ F5 Y$ git clone https://github.com/ethoxy/multi-geth.git
8 J, ?- F+ X/ y5 H# [- D4 J% B$ cd multi-geth
$ [$ v" r6 [  `) m  l( A$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。. T  t1 t, Z2 @# ]
在multi-geth目录中使用此命令运行Kotti:8 `# Y' q/ t# N; V
$ ./build/bin/geth –kotti
' Q9 F7 B  u: W$ J! Z3 z" a( ~; n6 d" B% F6 D
现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
* @' \8 P* z( S' Z) _3 X; J% U在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:3 P+ M; F: u( U, O. }! P; }3 B
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
4 P# T9 r9 Y+ O# a现在我们开始创建私钥。
4 k3 }1 y4 ~; {/ }7 n在Javascript控制台中,首先运行以下命令:; j& W7 R2 \; \8 V$ t6 m# H$ l' s5 A. u
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。  b) e& n) T5 ~  X6 |
这个帐户稍后将用来部署智能合约。
6 K5 E; w- V0 H; X8 N目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。
% q8 ~# i+ r: h, n+ o$ }, W/ `- Q0 O; r) v9 p( s" k
6 h3 _' o, ?7 @5 ^) C8 J( g
注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:8 Y6 @: D3 W  t: d, @4 d$ z
> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:
# d  X3 `+ O7 K$ |> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。0 l, l( ~/ ^# n1 x2 X) T
现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。
" n% m# ]/ `0 S. v0 s) v此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。* {8 I/ b7 S& u: r$ z
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。 6 ?/ k) \  r2 v8 I6 L1 }
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
/ G) G5 @# D/ S) L& e我们将使用Truffle在Kotti上部署我们的以太经典智能合约。6 d3 b4 a- p3 ^0 \2 ]) P" n
首先,需要在计算机上安装Node.js和NPM。9 f; w, h5 J+ B# v# h% h
我们将首先通过以下命令安装Truffle(可能会需要sudo):# T! X7 p; ?  q0 H3 V8 E
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。. J2 h9 f+ o4 [. q0 t  i) A6 x8 w) U
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:
+ S* E5 l( }# W! s1 Y$ mkdir kotti-truffle && cd kotti-truffle; V( ~% g+ |; U/ l0 Z9 @" S' F
$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
7 _+ A9 c2 l# P+ b9 L2 f6 a 至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
" j4 Z2 `! d4 y0 P) q2 B* r' @) h+ B- ~ 在目录中键入ls,可以找到truffle-config.js文件。
+ j4 d3 A, ]+ d6 F4 J用你喜欢的文本编辑器打开它(这里我使用的是vim):: L$ _9 b4 z" Q
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。
  U- S9 C* m& B" X* G删除truffle-config.js中的内容并添加以下内容:) I% R8 F2 O& S' O; l& i, Y
module.exports = {# I( Q0 X7 X8 e& H
  networks: {' E2 r9 `6 W  I. m* A
      development: {- ~; P3 L7 o8 ~$ a5 ]
      host: "127.0.0.1",  // Localhost (default: none)
7 B3 E9 U) c6 u" B' U2 O      port: 8545,        // Standard Ethereum port (default: none)
4 q& P/ d( ]2 T+ d      network_id: "*",   // Any network (default: none)
4 y, W3 F& `/ s# ?     } ' F# v4 B0 X7 D$ t* `3 [7 c
  },
$ ~. V6 |6 Q4 R  E2 r  compilers: {4 v, H, @1 g* c6 z( l% y* D
    solc: {* O2 f/ n7 o5 l) m, w
      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)( L4 t2 B! B5 @# d% T, ?
       settings: {        // See the solidity docs for advice about optimization and evmVersion* D1 m% ?& \6 O7 z- O- z
        evmVersion: "spuriousDragon"
7 J( w! e2 }# Y      }
6 I* r3 b5 E% C4 w& c: U    }/ Y' \* b$ i; \5 `
  }6 q8 M, i/ _, b- `, n
}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
  X' i1 Y" O# ?! N7 ]7 r我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。. ?2 E1 A1 e4 g9 G: T: |  v
运行以下命令:
0 a) U  y/ b' Q* rtruffle console如果控制台内出现如下内容:
1 ?. G* ?6 r: L) q6 X) ]truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。& ?% E6 s+ k3 G/ W4 s) R( h
现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:  J1 u; ?! x% ?, v0 U+ m
pragma solidity 0.5.1;
# I; u2 L) a3 b/ Fcontract TrademarkRegistration {
+ y( d/ G# Y0 }    struct TradeMark {
: j. B- B6 [# E: f        string phrase;; g) }! W# Q% l) q
        string authorName;
5 t3 h4 u. Y: W        uint256 timestamp;
' t6 P2 O' T3 @0 H$ L1 A2 |        bytes32 proof;+ l+ D: l' w1 Y1 i3 Q
    }
. m" b: F. F+ {1 V ! T: `0 T8 f; x/ {
    mapping (bytes32 => bool) private trademarkLookup;
4 P, w! p9 Z6 i" ]  k  X. `+ y    mapping (bytes32 => TradeMark) public trademarkRegistry;
& F8 a: g# p* s4 |! ]. {2 I   
  |/ j! O3 f% a/ U1 Z/ l, G    function checkTradeMark(string memory phrase) public view returns (bool) {( l0 X9 K+ L2 T
        bytes32 proof = phraseProof(phrase);
# P7 ~. G- R( d* e+ {( ~        return trademarkLookup[proof];; S5 W" i8 p0 P' p' y# d8 t- Q
    }
9 u3 @8 W2 x) t6 h - O9 }1 ^7 a1 J( |
    function registerTradeMark(string memory document, string memory author) public returns (bool){
# S- ^+ b  y5 k2 ~8 g        if (checkTradeMark(document) == false) {! _. R# W$ V8 @1 V+ W6 s) D, e
            bytes32 proofHash = phraseProof(document);
# ?9 G8 u1 b2 U! c+ z$ P0 t& S. P            TradeMark memory trademark = TradeMark({' X: n9 f3 K7 }/ n- w9 r) v
                phrase: document,
% x& B7 A* b+ P3 X" }. X                authorName: author,9 C2 y0 i- j$ {7 R* a) B1 }3 y
                timestamp: now,
! P: r* G5 R! N, v' y, L                proof: proofHash
7 T. {1 {- w! a$ \+ d: i            });! N( w7 Q7 ^. l* W- m: H
            trademarkLookup[proofHash] = true;
- c' g1 {' {& T7 |            trademarkRegistry[proofHash] = trademark;
  k: u, [4 a# Z- K# W            return true;
' l" V2 h: l6 c" z5 X$ K        }
/ @- A7 w+ I5 Q, |% N( y1 G. v4 q4 C        return false;& o2 Y  U7 w) h% D/ x& d7 O
    }3 n, ]+ J" a- u7 R
! K, I+ v" ]; E  E9 x$ C
    function phraseProof(string memory phrase) public view returns (bytes32) {) O% ^1 `; O# j( Z# ?3 u
        return sha256(abi.encode(phrase));
. D. r- z% g, Y% d  f    }
$ t% m1 R4 O$ `+ I) O! ~. y* J$ Y" [   o! f8 P' P; H( z" |. j& M1 J4 Y% M
    function getTradeMarkData(string memory phrase) / d3 R4 v8 `. k
        public view returns # x% ]) D4 x( W/ z0 D6 y+ h
        (string memory document, 0 B$ b' @& ?% i3 J  e& ^+ W
         string memory authorName,
; {$ V' d0 a  c: N1 L0 u         uint256 timestamp, % j! J$ \! B0 t9 u2 |, W
         bytes32 proof) {
" x) l  d; b6 Z+ z7 M. D        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
- z" w! C9 b/ f  ~7 ?8 t. J        return (t.phrase, t.authorName, t.timestamp, t.proof);
: K+ @/ D# p( f, h) S! |    }; A9 s9 X# j4 O6 B- H
}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。% `1 O9 N# d" Y& |, {' l4 k1 N
我们将通过运行以下命令来编译此智能合约:
! u% n0 @4 b0 mtruffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。 5 [: f$ L+ u0 ?9 J4 t
现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:( l. g( z% D# R( ~
var TrademarkRegistration =
6 j- Q6 _" w: L: Z3 N    artifacts.require("./TrademarkRegistration.sol");
, h- a) z, N1 h
) T: p0 b+ e, [: D" o% b" amodule.exports = function(deployer) {- y/ B$ Y7 H% F! U
    deployer.deploy(TrademarkRegistration);; m+ [9 v$ d. X/ U1 A
};2 t/ J6 Y1 a" v/ I% N* N% H
保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。
& t% O+ E8 M8 l0 Y7 w首先请运行以下命令:
! A, t2 h+ H5 Mtruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:
6 F$ O! d6 A. m7 H# p; a( A  a' u. N2_deploy_contracts.js% ^# J+ O# h9 v: n0 k1 x. P. ~
=====================
- l$ C# b' R) x9 s6 A" }( q1 ^  pDeploying 'TrademarkRegistration'+ V8 [$ e% z( [. q, p6 Y; |
---------------------------------   2 M# T7 E/ Q6 N" e' ]" @
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   3 U$ P: Q6 w/ h5 R
> Blocks: 0              Seconds:4                               1 O7 g% ]6 f! W1 |; W+ k. u; P8 q5 Z
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12
! s2 G! y' {8 n  r" v  ], ?, b> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
0 _" W' u' \5 T- i, k! G> balance:               9999970.000876312
4 f' h; B! \% T- i) a0 q> gas used:             932772
: t/ f; G9 T  u' g, N# {0 W> gas price:             20 gwei2 T: f) x4 C) q3 [6 h; d
> value sent:            0 ETH0 A/ A3 u7 G( a% o6 k7 Q+ j! D
> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
' }8 B' d" B, J% Q9 t# o现在可以测试我们的智能合约了。/ K2 o. R4 u7 o. W' j1 N7 z5 x
运行以下命令跳转到Truffle控制台:
$ K9 u. Q3 D% ]' l9 e2 \( w/ F$ l$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:$ N, G. G0 C( @4 ?% i
truffle(development)> let trademark = await TrademarkRegistration.deployed()+ m" L1 x- ]- ~- W+ H' K
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。
- w5 z4 x* l+ R2 w2 A0 o$ ytruffle(development)> trademark
" T/ z; s9 m- U$ g( h. k) _" u4 A) NTruffleContract {" u5 d+ l* l5 s# x, ^" E( P
  constructor:$ |0 p6 R% O1 p3 b1 L3 m* @  c. c5 J
   { [Function: TruffleContract]
  P' E: X+ G3 O: e) x*4 ~4 }: b3 u" u9 s- {5 I
*0 R4 _+ l7 K, o$ G4 P% r
*& x/ I! Q) q! G# `6 H$ ?9 r% y
  send: [Function],
0 p! x5 B8 C! \  allEvents: [Function],
4 k# o5 Z% R1 w. i9 x  getPastEvents: [Function] }请键入以下内容来检索地址:
& t% \' o/ g  {( c0 G9 Qtruffle(development)> trademark.address
' E3 F3 D$ k8 E; c9 N, [7 y'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。
) n' v! V' }3 R$ L# l6 @  Z先来检查一下商标是否已注册:
# V; x  v9 `1 Y9 utruffle(development)> trademark.checkTradeMark("ETC Take My Energy")# ~2 s3 Q- \* p8 k3 Y+ v
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。
( G! T5 D0 i8 O  o9 Q+ R( f" Gtruffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")/ S+ Y* u* w2 Q4 Z0 N( @
{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
- @& u+ H  q! M1 i/ c! n  receipt:+ k" a* ?2 P, v% L$ i5 L
   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',$ m& H! Q1 E, `
     blockNumber: 250684,* C- [: Z! Q; V) }  g& M+ c
     contractAddress: null,  \! i4 a7 O4 t" `
     cumulativeGasUsed: 27024,
, Z. g5 h4 s4 v2 p. A1 H, i9 a     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',3 r% s; X! ~4 Q1 K  _& N
     gasUsed: 27024,4 F, E+ D& U1 |3 j' R
     logs: [],7 \6 P0 ~1 o1 A
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
! N$ _4 B# U& M     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',
5 K7 Q. ]$ q' i: H     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',2 X1 X( Z. G$ H( O# C
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',+ G. B4 h: N+ H# I$ O4 X3 y
     transactionIndex: 0,6 I6 R0 ?: g$ o+ U! a
     rawLogs: [] },! \; ~3 K* Y5 O) L
  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2