Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。
4 F, P5 n1 s% h5 q! l我们将在本文介绍如何向Kotti部署智能合约。 ' t) J0 ^1 O  l* O4 k
此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。9 c3 i% Q5 M. G8 d
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
) O% Y) F# B$ k* y3 b运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。
& a7 t/ J/ m9 P3 }+ i我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。
! @( \. N: q8 {8 l! q0 w$ git clone https://github.com/ethoxy/multi-geth.git
% Y# c( @$ L1 S( [1 c2 W' k/ m! g$ cd multi-geth
0 r' y: C$ |9 Y# Z$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
, Q- n# S. M, r& W( _& g$ M4 G& o在multi-geth目录中使用此命令运行Kotti:
, x2 X# Z( n  Z* \/ i$ ./build/bin/geth –kotti
1 _: p6 }1 P+ L/ F% b' n6 h
% A9 s/ _! x* M2 b" T1 i2 Q现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
7 M! G/ W( }2 K在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:. |7 R5 ~  [( z0 \( m4 [
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
0 t9 x4 [$ S" e9 u4 c现在我们开始创建私钥。: N& p* {; }7 |+ }  P. T' g
在Javascript控制台中,首先运行以下命令:/ C3 {; L5 E1 e7 o0 ?0 ~
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。0 {+ S3 W4 g9 z- j8 f/ s# M
这个帐户稍后将用来部署智能合约。9 }# U9 F& ?1 y: O* H2 f% Q
目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。
! a. [; P' i) X
2 B5 j% b6 V# V' V# u% d! B! i
) p) O2 L! J8 G( R4 K  ~注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
$ |8 D/ f4 t4 b: l% x> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:
, I9 B2 }% v! U) A/ ^9 @6 X> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
% g3 N4 E- {. X8 {) w现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。
. C4 I3 ^$ A; L4 k  [4 C3 h9 H此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。
8 h4 @; _0 H0 t& |Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。
0 g: |+ \; X* J5 |; m; Q# A这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
( V; u" s0 H# f3 x1 w9 U) {2 ?我们将使用Truffle在Kotti上部署我们的以太经典智能合约。) b! F( e  r4 Y% n& ^( x) H' ]
首先,需要在计算机上安装Node.js和NPM。  v( `0 B7 S, K
我们将首先通过以下命令安装Truffle(可能会需要sudo):* @( H! ], }  E7 k) ^% c5 j
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。& |, S) a* n& D: U% G
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:3 {! r) v! J# r& _  V
$ mkdir kotti-truffle && cd kotti-truffle3 Y  k7 w' X4 f% e: |  H
$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。$ {7 p5 A4 i+ r  W
至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
( }% C; f0 F! i+ h+ R 在目录中键入ls,可以找到truffle-config.js文件。 : ?' t3 S6 z; y. H, g% }. V
用你喜欢的文本编辑器打开它(这里我使用的是vim):
2 [4 U3 a6 b- G7 y, {. E% h" C- v $ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。5 k. m8 J8 A! c  F! L0 M; ~$ s
删除truffle-config.js中的内容并添加以下内容:
  G; O8 Y; `1 B# _& _: ?. Qmodule.exports = {
- p; B% x  \8 v- \7 h6 f- n  networks: {) D8 L, a: I5 {
      development: {
  v: l# ^. _' N7 N      host: "127.0.0.1",  // Localhost (default: none)- X9 T9 a6 S8 V2 a( f# u( _; m
      port: 8545,        // Standard Ethereum port (default: none)
  s# [) Q! E+ f$ ]: l! U& \5 D0 _# K      network_id: "*",   // Any network (default: none)
+ R) j' t4 M+ i9 m! P     } - d( m6 m/ K* h* \1 s
  },6 L/ D9 b+ J! B
  compilers: {( t' y' ?% |0 @# s- A% h: F
    solc: {3 B, Q/ [5 ~& `( ^# r
      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)6 t4 H# Q) o# V3 I, N
       settings: {        // See the solidity docs for advice about optimization and evmVersion
0 m7 A* E* w  f, r        evmVersion: "spuriousDragon"
0 W3 M3 u. i8 T% B+ D      }
0 |* I4 I% R5 ~# k    }% z' t  }+ d, `0 I! {! D
  }
. ?. ?# }4 q& j}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
8 d7 }- I6 o  H我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。; ]6 Q6 m& \: J1 q6 t7 V& U. @
运行以下命令:
/ H2 K/ r/ P9 Q2 U' o3 S" Ytruffle console如果控制台内出现如下内容:7 Z3 A" w+ z& d' E; J
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。
, q3 X) Q' [3 V) a* H, S8 `现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:2 Y! }" ]; w/ W1 B- B; |
pragma solidity 0.5.1;- R$ _  O  s& i* a9 I
contract TrademarkRegistration {
" G6 @1 h/ o1 N. c2 l    struct TradeMark {
+ k. F; v# @% x' j        string phrase;
/ u" ?5 ^8 S; C1 v3 f4 X        string authorName;
( i9 w  K$ n" S        uint256 timestamp;. b4 H- w6 u3 B5 q; b( y( S
        bytes32 proof;8 O7 Y4 U" _" }$ |( Z  o( ]+ K
    }
; V& e2 E, M2 k' `" @
& _* U, D9 O- M' T0 o* ?    mapping (bytes32 => bool) private trademarkLookup;
/ _) U& G4 c6 i5 a& G5 Z    mapping (bytes32 => TradeMark) public trademarkRegistry;
4 Y  ~' u  z# m/ I4 E   
+ `4 j) X, c5 ]2 i* ^7 k    function checkTradeMark(string memory phrase) public view returns (bool) {
0 k3 d: ~, N) X' G        bytes32 proof = phraseProof(phrase);
9 o# s* Y. I9 _7 m7 T- t5 e        return trademarkLookup[proof];
& X2 ^4 K; r8 L% l; e$ m& Y( D    }+ P0 z& B9 L6 i5 u0 Y+ Y

* g% C/ G, M. T3 v+ I    function registerTradeMark(string memory document, string memory author) public returns (bool){
" w2 c& s0 e0 b# U+ I7 v1 `        if (checkTradeMark(document) == false) {; i  _6 F  y+ q% _' C# }- r& h: e7 Z$ N4 Q
            bytes32 proofHash = phraseProof(document);
" D& x% r! C8 |            TradeMark memory trademark = TradeMark({) l% F! _2 t# g* Z, d' X. I( p
                phrase: document," e8 d  y# I/ a3 T
                authorName: author,* Y2 o  ?$ g  i# u0 s2 I- V) E7 F
                timestamp: now,) I7 V8 y! c3 n1 u+ Y- {) E0 `
                proof: proofHash8 K+ n; f& f: n+ w: y) G- J, |3 Z
            });3 s# A, F; T7 p3 k4 F6 Y, k; ]
            trademarkLookup[proofHash] = true;7 l2 I, R8 B9 K, q% D
            trademarkRegistry[proofHash] = trademark;* x& }( B8 k' a5 W& z' |) x$ Y2 R
            return true;
; j9 L+ i" t7 D        }
9 c) l' f) p/ C6 }. h, b        return false;$ R0 z5 s  X. j( l
    }0 j1 G2 N3 ?1 B- w* x5 w* b

' h$ G) U3 g+ q6 G4 t1 Q! h    function phraseProof(string memory phrase) public view returns (bytes32) {4 `; R2 I( c  x8 d7 K
        return sha256(abi.encode(phrase));
8 ~& U6 C4 D( t) ~5 A1 n7 k0 f2 |    }
5 b, i; l) o( w5 \3 h 9 d0 A. m# w% R9 G* p+ n8 X
    function getTradeMarkData(string memory phrase)   n0 J- c# ^: ?' L1 d8 }
        public view returns * B: Z* A% {' m$ T
        (string memory document,
+ f9 A) x+ U/ a% O* Y" n, R         string memory authorName, ; `5 x, e( h, p
         uint256 timestamp, - U* w, T+ I0 p' d, q- H
         bytes32 proof) {
8 `1 I6 |6 D2 i9 _- ~4 k7 ?; N        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
1 f% C% p* P9 t0 C# j, ?. v        return (t.phrase, t.authorName, t.timestamp, t.proof);
' r; d" N" ~5 Y  m# k! {    }
) v4 B6 S( i' n, M}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。/ `/ P$ M, t/ H' V/ n- D9 y' ~
我们将通过运行以下命令来编译此智能合约:
- ~4 M3 ]; N  f2 {( Ttruffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
0 k# L/ J0 N8 j  Z现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:$ e' N2 `, b9 E, B" H
var TrademarkRegistration =/ T* s5 P$ l6 f1 c6 W1 B: D
    artifacts.require("./TrademarkRegistration.sol");
/ _# b; `& x. i  L; k $ `, `* L3 d2 K  ?# [$ n, d( S) v( `0 V
module.exports = function(deployer) {! P4 k7 F1 f( N7 ]& Z8 _; W! Y5 `
    deployer.deploy(TrademarkRegistration);. }9 I7 |- t& B/ m1 V% F
};, A# l: B9 w& r, ]$ E3 H
保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。+ E* h; E8 W8 {! u2 u# O
首先请运行以下命令:
1 L" K/ l6 ], d$ p6 F' Ntruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:
4 [# X- d  a  C( `) h2_deploy_contracts.js
- d; F) ]5 ^: o; b=====================7 o; P! X( v: v4 O/ \; C
Deploying 'TrademarkRegistration'
$ ^, X3 B5 l6 O% _" r---------------------------------   7 q) O  w/ }/ J4 v
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   ( \4 ?: f! r$ C
> Blocks: 0              Seconds:4                              
# h. A1 ?0 Z7 k> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12& K/ ?7 x( _/ Z* T- R/ ]
> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A& Q! X  u9 y. e' W% M1 W; U
> balance:               9999970.000876312- G* t, Q2 p, ]0 `! q; @) x; y
> gas used:             932772' n5 H$ P$ m( x3 b1 h+ l( O- |
> gas price:             20 gwei
) @: V4 U3 f) v; a$ I7 q: i> value sent:            0 ETH
- R6 N" \, _5 O6 U1 e> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
7 o1 t6 w. g" p2 Y0 `, o$ w现在可以测试我们的智能合约了。' ^& Z/ h& ]! |! H# [
运行以下命令跳转到Truffle控制台:* l& i% l5 }; K; g. g0 H# i: }- `
$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:1 `# [" W: D4 E
truffle(development)> let trademark = await TrademarkRegistration.deployed()
/ y' K" ]  C, n$ M* h3 @9 sundefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。
. R" }" N; o: Y0 _truffle(development)> trademark
3 |3 \5 K3 o5 x0 ~) fTruffleContract {% @% d/ i! Y* D5 H! m2 j  T2 V  a% a
  constructor:  d$ K2 K4 `6 B9 P4 p& N1 W! R& k
   { [Function: TruffleContract]) w$ ^  S1 a3 m6 X+ b
*
  T+ j5 e; I' M$ a& \9 ]! C/ f*1 w% ]/ ~# T7 o! g6 |0 x7 J" z3 W
*. |) g4 u" i& \2 w) E
  send: [Function],% p5 |' C1 T2 ?: d
  allEvents: [Function],  U0 M0 f$ C/ D
  getPastEvents: [Function] }请键入以下内容来检索地址:
& H& \3 q; A) U6 L& jtruffle(development)> trademark.address
  Q0 [  g- C2 ?% t; b* X4 S/ x) d'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。
0 V: w* l  a5 z/ h  C" s2 n先来检查一下商标是否已注册:2 I0 Z% T' Q$ f  V" u& \' [
truffle(development)> trademark.checkTradeMark("ETC Take My Energy"), A7 Y' \( ~) e, i9 \2 g1 r# `
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。9 H2 G$ ]1 x# M
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")
3 U$ n/ W. w1 K( e  X& H$ A" Z{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
) v( I7 m. V- k6 ]0 i. C$ @  receipt:
' G2 V$ _6 @9 l) j5 k; a( c   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
- \: G5 j- T6 y# F" n% z" P' Z/ [     blockNumber: 250684,1 _! }9 \: t  K# a* g
     contractAddress: null,
8 v/ _0 x7 d5 g" h  d     cumulativeGasUsed: 27024,7 R" I/ H3 @' Z! v
     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',4 V$ a6 x$ {9 Z" u7 Q" @
     gasUsed: 27024,* R) @- L$ @7 [7 U; k, A; Y
     logs: [],; J. T3 p5 E4 L1 Z- }6 l( k
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',; j2 [6 U7 U. |8 C" E5 J; R
     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895'," _* i7 f7 j3 d) {# p) ?
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',
& C5 {' [* [: \6 n     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',6 `9 E7 h! j! x. e+ v; X8 A1 {( q* H4 S) j
     transactionIndex: 0,8 _2 b9 ]$ z6 G5 X4 t, H. z
     rawLogs: [] },
: F8 Y& H, Y5 M6 Z. K. T, r  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2