Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。 % J" H' M( Z; e6 g
我们将在本文介绍如何向Kotti部署智能合约。 ! J) O) Y6 ~* Z$ E8 m0 z2 j
此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。, b0 ?3 W" J; C9 {9 [8 y
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。' h# k9 [' `# d! Z% N
运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。
6 C2 M: T1 p' @我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。3 v( i) Z( v0 j9 `  G5 K
$ git clone https://github.com/ethoxy/multi-geth.git
, `6 W6 }& k+ F6 \" x" f! x/ U$ cd multi-geth
& k5 w8 s3 Y4 n$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
; A( Y, Z7 R& D1 n* h6 a* F在multi-geth目录中使用此命令运行Kotti:" C! \  H, o  J4 V  F( d
$ ./build/bin/geth –kotti
" @" A6 F6 b# Y, ?# Y1 j
: c1 X* B- h: o& B, Q现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
& v. r5 z7 o3 M5 h在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:* G9 R+ q/ V1 p8 ]: R/ X3 _( R
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
" ]7 ?: O+ R5 t# p现在我们开始创建私钥。
6 W! ~1 r: ~" w; u在Javascript控制台中,首先运行以下命令:
& w6 U/ p" x! C4 f/ ?( O/ T) J> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。" I3 Y% Q; Y5 _+ h( w% ~
这个帐户稍后将用来部署智能合约。
$ u9 Q" z' k0 V, U目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。4 I* \, H: v* x& P0 Z( b

, Q% `( B* n1 k' b- s' ^/ j4 U4 U$ S* N& C: V( J
注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
* S2 X, ]% x7 C> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:& d2 K9 ~% k. x5 X
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。3 M5 G$ q$ y/ A4 R4 C( N+ J5 B
现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。/ R6 u6 {) F3 r+ i6 H: x
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。* E; W$ m5 P$ W7 m9 j0 O3 [
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。
* W0 K  W& J/ A! ^这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
+ C! y) u! w7 l: f# l我们将使用Truffle在Kotti上部署我们的以太经典智能合约。% C2 T  n4 w4 m2 Z: o2 Y
首先,需要在计算机上安装Node.js和NPM。
' c; B2 `7 c6 v* x9 k( O我们将首先通过以下命令安装Truffle(可能会需要sudo):
: A; t1 C( f+ V" @: O4 p$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。! S5 z' }# {$ n* N
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:& v% J" w& v: ~3 {" ]3 V
$ mkdir kotti-truffle && cd kotti-truffle
% x' X  S: o8 W* ~  J: I- i0 e6 q$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。$ P+ _7 T4 n% u+ }2 g: I
至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
8 D9 o& U- {' W+ j1 S0 m 在目录中键入ls,可以找到truffle-config.js文件。   z' _7 j5 a0 W* S& V
用你喜欢的文本编辑器打开它(这里我使用的是vim):
- v2 i" D9 H- U; A$ Z $ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。4 e7 E" `5 T. J/ K
删除truffle-config.js中的内容并添加以下内容:  d" }/ ]! Y0 K- v5 \; r, |; R
module.exports = {* b8 E1 z5 L5 u+ T% i
  networks: {
! l9 i  d9 t9 N- D      development: {, |9 W* B; R( O) u# R/ W: F
      host: "127.0.0.1",  // Localhost (default: none)
: g9 A$ b0 Y' F$ |0 B      port: 8545,        // Standard Ethereum port (default: none)! D* L+ C' Z0 w
      network_id: "*",   // Any network (default: none). N: ~) G0 |7 B4 H6 \9 D" L4 e2 e
     } , [+ G3 k2 S4 B& k
  },
1 j5 S: f  `; i  compilers: {
4 F; ^- L3 x$ m  X- I2 x, d    solc: {
  H. F$ u1 Y, x" Z% Y) F- |      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)
/ y% d1 C: B3 J       settings: {        // See the solidity docs for advice about optimization and evmVersion
( R. h% k* T2 Q: n4 }        evmVersion: "spuriousDragon"% R1 s. B1 l# n1 R: d* B$ \; O
      }
, n# o) v3 d1 ^; @2 {) i% m, @1 i1 k    }
, n( _, f( D4 D: ?0 K  }
& F% x( o5 @7 S# x9 w' t}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
/ Y" F$ g. ]; U! m7 a我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。* X) H4 [( I4 f7 c$ M
运行以下命令:
$ n$ H: h8 x; o/ l; Dtruffle console如果控制台内出现如下内容:$ H. R7 A4 i: r$ n  p1 c/ e% m
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。
# a1 T: v9 N& ^* q5 `现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:  Z# s, Z$ R6 I- u- d2 W  V
pragma solidity 0.5.1;5 ~5 |' \$ ~; Q; ]  o
contract TrademarkRegistration {: U$ r, r- u. u0 u! f% D/ f" g. ?
    struct TradeMark {* ?( t+ W/ }- R6 o: o6 x
        string phrase;
1 G3 Y; }3 v0 K; s# b( R        string authorName;- [% U' v/ j, p; F
        uint256 timestamp;) b  P1 Q! M! A3 [/ l% n) e6 S
        bytes32 proof;9 S& F  G9 T9 ?$ g9 U
    }
9 [3 c7 R! u" B9 P) }4 q' B
4 q: o2 Z' c8 ~) o$ @# E% x    mapping (bytes32 => bool) private trademarkLookup;; W, `. \8 Y# |+ ]2 I1 F: B
    mapping (bytes32 => TradeMark) public trademarkRegistry;# u$ W  P7 M9 ]. N$ C% v
   
4 y8 T- O4 `+ G4 R    function checkTradeMark(string memory phrase) public view returns (bool) {: W0 \8 g+ \  r2 W) C! _
        bytes32 proof = phraseProof(phrase);# ~' G9 ~2 P; L* z8 V& Z; }
        return trademarkLookup[proof];+ J1 F7 Y) a) C1 P9 y; R
    }1 k0 D/ `0 }, q7 o( Y5 F: j0 m! ?

9 l% g: I+ I  ]" w! f/ }) ^    function registerTradeMark(string memory document, string memory author) public returns (bool){
( ^7 n) \! @) @, s8 H        if (checkTradeMark(document) == false) {
1 u& @; i" j8 d9 z) r            bytes32 proofHash = phraseProof(document);
, }! O3 I0 Z7 ]$ [4 w! Y  W3 Z( u' l' l            TradeMark memory trademark = TradeMark({
0 T6 g6 [  ^; @) Y" f" {9 R                phrase: document,
. \3 F. k) w3 Q  O5 [                authorName: author,
6 Q. q2 H* n6 j                timestamp: now,
  r, |; W/ N2 D' F' Y                proof: proofHash, o6 k  E. M! ~3 z
            });/ L& B6 P& Z  J
            trademarkLookup[proofHash] = true;8 s: V; b6 P! c9 E
            trademarkRegistry[proofHash] = trademark;* Z3 C+ I+ X* U3 t7 B8 {" d4 y. n
            return true;
" S9 ~- c: O+ V; ^9 G8 ~        }
+ j6 ~! c" H$ {3 U+ Z  g        return false;
; S/ J; C/ {" T9 D2 @    }
# H' l7 J: F7 e3 P " u0 g3 Q, ~" Z' Y* ^' {* e( c
    function phraseProof(string memory phrase) public view returns (bytes32) {5 U: n' x4 P# R5 q: V
        return sha256(abi.encode(phrase));; V1 }- Z( I& M+ e3 `7 \
    }, m/ s7 |4 E# q0 L2 i' q! x# S

  g3 a& c# p2 h+ \& C    function getTradeMarkData(string memory phrase)
/ q+ E9 S# R# ~) m1 A% d7 ^$ i        public view returns
  S0 C$ J. |" o        (string memory document,
6 u; s; y: i7 U) Y) i4 {         string memory authorName,
5 v: ~$ P8 M0 n1 r# `* L         uint256 timestamp, . T  J1 s6 K/ w, O: u
         bytes32 proof) {" D  `" h) m/ k: w5 U/ c
        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
6 B& W# M  v3 w4 j7 q        return (t.phrase, t.authorName, t.timestamp, t.proof);
3 |. s) P1 @* h    }  N2 z8 A! s8 {4 K/ L9 f
}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。
2 c* r3 g$ i' B6 R2 Q0 _我们将通过运行以下命令来编译此智能合约:
( Y2 _" p5 m; N; l! v8 J$ ptruffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
. J5 r" E# p/ T5 m现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:
5 Z- n4 J9 v& f  P# k* I! bvar TrademarkRegistration =
/ V0 n& ^6 |+ b    artifacts.require("./TrademarkRegistration.sol");
4 O" \. o8 G" a, T/ h" Z2 S
! h% y  \' \/ j. ]( P. d8 cmodule.exports = function(deployer) {# A9 u0 _. A7 O% u1 `) B; B. ]" o
    deployer.deploy(TrademarkRegistration);. Q$ ~* T" E  x# B/ Z2 `0 |) O
};
6 @) ?0 A8 D# g0 S5 {( i; o1 R保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。# ^5 E1 m# L  a6 w. A' ~
首先请运行以下命令:
- N" l# i1 c% z0 q+ i, u$ E' O6 Ttruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:( U3 L  O$ [' [4 a( R
2_deploy_contracts.js" t, |( A# a; S" [+ z
=====================3 o# C8 B( A7 d4 r
Deploying 'TrademarkRegistration'
3 L! e/ S2 O& w& u; d---------------------------------   
* F  ~: d# M/ t, |6 O8 ]! b2 N  P> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   , H" F- b- x5 i3 R
> Blocks: 0              Seconds:4                              
3 [  j3 K) G8 e* T5 X: ]* z> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF124 n8 p5 O  f/ {
> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
% V2 |8 g0 I' N. q3 a8 y> balance:               9999970.000876312
* ]! f; N6 y2 W6 s> gas used:             932772# n) _0 W3 I: r
> gas price:             20 gwei' x+ B* R- x4 y$ g+ X' {+ W3 y
> value sent:            0 ETH
4 C. I/ w9 O* c5 R  z$ U4 g> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。 ) c. H! c5 W) K8 g: X& e% \: U. F, b
现在可以测试我们的智能合约了。  T$ @. z- F% Q, M5 s
运行以下命令跳转到Truffle控制台:- E6 i! o% j* x- e0 V
$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:
- j7 Z8 y7 B( k' ^9 a; ]truffle(development)> let trademark = await TrademarkRegistration.deployed()- Y6 P8 r$ B0 D
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。) n1 E: U# @* \6 o' O, E
truffle(development)> trademark3 H4 P3 j' H& u$ f
TruffleContract {* @9 L, @. t, |4 p0 x
  constructor:
* h( E# v: e; f' h+ \   { [Function: TruffleContract]9 Q% u* N: Y, x4 C" D: v
*# H& L7 v) i9 J- d
*
8 Z. _, M7 m) ~( @% V) N3 _*. ~2 @4 V" Z' Q* z
  send: [Function],4 C4 S# A6 R& T9 [
  allEvents: [Function],! I! e, p) e7 w4 h$ q5 U! G
  getPastEvents: [Function] }请键入以下内容来检索地址:
5 y8 m% U, H( V  X5 f5 [8 Utruffle(development)> trademark.address
/ c' G/ }0 _0 X* f5 G'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。
# k0 j$ j& j* q5 ]* g  x先来检查一下商标是否已注册:, e2 E/ M4 s8 o  N, O
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")
# ?# q* l1 k% u& M8 x/ Qfalse太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。! r& l' R8 M$ N+ B7 e
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")
4 T# Q/ A# m$ n! ~4 R. D' c{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',0 t& |; o8 G, W$ G) |6 R
  receipt:
" }* L2 D# [; d   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
5 S( V2 J& d& s     blockNumber: 250684,
1 S4 x! d& t, H  B- |, w$ @     contractAddress: null,
, p7 y6 d* e- S: X$ s3 s$ ]. d     cumulativeGasUsed: 27024,
  d  F$ [9 E) Q5 X! Y5 |     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',
; Y* U, y) W; h1 a; _# e% o8 H     gasUsed: 27024,
1 z& w+ E3 F/ M" W7 k4 e     logs: [],
" a+ [, ^8 h  r5 \     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
3 @# n5 X/ d( M( h% ?3 Y. @9 e* y' y     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895'," ]0 s, W! X4 D. H7 ~
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',; a* n: Y0 \+ {- z$ Y9 R  O! p
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',. g% Q: d7 `5 m7 I  M% H7 F: T
     transactionIndex: 0,
! Q6 P; R; t/ F3 M3 [0 L     rawLogs: [] },
: M3 u: {/ |$ U0 N3 H$ \  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2