Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。
* X! N5 J0 w1 {) D" E& ^我们将在本文介绍如何向Kotti部署智能合约。
. t- n' v7 l" S2 t2 _" Y( b. U此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。8 M( t; u$ S/ @. g1 e* }
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
- F: ~' E) A& H( F( ^  P1 J: I) O运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。
  x5 a" b( u, e) W5 {" P& \我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。* m7 |% J* r! o% X- H
$ git clone https://github.com/ethoxy/multi-geth.git
9 a  {8 B6 i' x$ cd multi-geth ! x6 f4 b  k( F
$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
7 |. q) R. T3 v# _: q  b在multi-geth目录中使用此命令运行Kotti:
' ]" _' T% y4 }9 L3 ?; S$ ./build/bin/geth –kotti2 b- X: F. ^  Q) M, W! z1 |$ @5 O
  D! f# I- y: G- p$ k" E/ R
现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。- V" f1 @( e+ v5 r  e2 I
在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:
, C; B( f9 x; U" T) L, W9 n$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
1 G2 A3 e" ~; j$ h+ p0 |& S% @现在我们开始创建私钥。
5 }+ ~3 J9 g6 U3 \2 W0 H在Javascript控制台中,首先运行以下命令:
$ s) v! }( i. M4 q* T> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。* X, _1 f" w3 S2 ~9 ?6 J+ Q, U* ~' ?
这个帐户稍后将用来部署智能合约。
* E  {5 B- }  ^目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。
, m8 v0 E5 `" u4 X+ M6 f1 G) H& W3 y' G$ F

9 o6 ]: x. |' r5 a1 C注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:. Y) [" K) Q9 D" ]  @6 C
> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:
/ F  ^. R1 j; o: X2 r9 S' v> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
' B( V% D& n* ?* i, t0 \, h现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。; b6 R  U' c6 y: g
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。
6 \; P: P. c$ y; ]* @$ {8 ISolidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。
  S* q, k8 V0 O! ~8 x- J, }2 p这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。
& c/ m0 u9 ^8 l0 o1 V$ Y) Y9 Y我们将使用Truffle在Kotti上部署我们的以太经典智能合约。5 y6 i( a# ?6 ^, M! C
首先,需要在计算机上安装Node.js和NPM。0 L1 f# j* \; b
我们将首先通过以下命令安装Truffle(可能会需要sudo):/ J  O1 Q7 B$ g: v1 E  l
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。
5 a  v' Q, v. S. N, y它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:) @0 r. g! Y& _1 i  m( _8 g: d) {- y
$ mkdir kotti-truffle && cd kotti-truffle
5 H$ g0 s( l( j; n- I! e3 G! C$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。" a' h7 i: b% k
至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。
9 C4 R9 V3 u0 Z2 O' c 在目录中键入ls,可以找到truffle-config.js文件。   [- `$ B4 ~, P6 _
用你喜欢的文本编辑器打开它(这里我使用的是vim):
/ k4 g& f1 W4 s, j/ t- n/ h $ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。9 p: N1 }' J3 u% I  G! [3 W
删除truffle-config.js中的内容并添加以下内容:
. X7 e$ I4 I& x6 R: B; {* k/ Mmodule.exports = {
( T' t! n/ ^: ~) c( \5 b: w9 X' Q  networks: {0 v; T' p  ^2 }7 q  x0 w$ X* }- Q
      development: {
$ e  {1 ~6 K. D2 E, \. |      host: "127.0.0.1",  // Localhost (default: none)
6 H# U2 {' Y/ S; Q      port: 8545,        // Standard Ethereum port (default: none)0 k7 U7 W/ [. ]. b
      network_id: "*",   // Any network (default: none)
9 X% y/ y( O- o, Z$ |' z, U     } & W- {( e- q# i: \1 @. f
  },1 A2 k+ M1 Y; q1 |# e* a8 k
  compilers: {- T  @! C4 S+ H. a$ m
    solc: {+ o: B2 P! n4 r: p5 p4 g+ v7 G" O% r
      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)$ R# Y; [( g1 n3 H' |
       settings: {        // See the solidity docs for advice about optimization and evmVersion
* ^! \9 T4 D9 a- w, P. S) b/ o        evmVersion: "spuriousDragon": y  N. U: x9 z, D2 h; ?
      }$ n; n7 u8 z4 n% w0 G! y* Z* |
    }
2 e- U$ w8 Y; N" W  }
- R, h6 M8 n# g  X) D/ l! g0 P7 X}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。  u+ t6 Y; D4 ?' l* g- E
我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。! h: \" r; m$ M' ?% F& P  Z
运行以下命令:
8 w3 C7 p3 [  g3 H- ]truffle console如果控制台内出现如下内容:; {4 l! D. z' d. K- \5 k, K, A' a
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。
& q) m. i9 |/ Q5 @! _7 I/ t现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:
. g8 m' ]7 G& X, w  M! w7 rpragma solidity 0.5.1;8 [/ |. t9 O, U
contract TrademarkRegistration {/ \; c; I' \" I$ u9 q( j$ u
    struct TradeMark {
1 m6 m. ]& N+ ~& P( ]7 d$ |        string phrase;7 l2 m+ o4 X' f. O: u
        string authorName;
, @5 W/ y8 X5 w0 D0 d/ G5 c        uint256 timestamp;: w2 t" L/ R, d0 l$ m6 ~
        bytes32 proof;0 M  E; {& k- k0 u! q6 A1 A2 x
    }% J* H# |2 c. `* X
5 G3 F4 h  Q/ }/ {) z$ Z6 L
    mapping (bytes32 => bool) private trademarkLookup;( M4 s4 v: r; V- Y9 s
    mapping (bytes32 => TradeMark) public trademarkRegistry;6 p; o5 ?  w, S5 l
    * Y( E, n& k2 L; T
    function checkTradeMark(string memory phrase) public view returns (bool) {, C: {) C0 `% m
        bytes32 proof = phraseProof(phrase);
) \# ]% v+ z6 V+ S' k        return trademarkLookup[proof];
6 \8 S/ {7 W3 h6 _: X- c5 M; q    }
% Q' q( d2 I# L, l- a! z" s( G6 ?
( |, B4 r; P% S- h  L4 K    function registerTradeMark(string memory document, string memory author) public returns (bool){  ?' d: J  T0 y4 S( d$ r
        if (checkTradeMark(document) == false) {
0 ~2 m' H% w. I) V9 X0 r  k! K0 d            bytes32 proofHash = phraseProof(document);
. r. F4 m3 Q* Y3 l/ j- ~8 f1 G            TradeMark memory trademark = TradeMark({
! r3 e  x6 [2 C3 |2 g, l                phrase: document,
& W% t4 ~& j5 p                authorName: author,
) W& o- c- ?5 l" v3 Z) x                timestamp: now,! H& E6 z6 y9 g; G8 |
                proof: proofHash
$ F1 B* {! i/ C8 e            });
% e# L, \* V8 C/ e" u            trademarkLookup[proofHash] = true;- z& {! r4 c8 q& R6 M0 U+ m* n' @! F1 m
            trademarkRegistry[proofHash] = trademark;% s0 Y0 g  ]3 q8 V. J, K  B
            return true;% t# L7 {3 k3 ]( p9 w. t! b$ x; V- B
        }
$ R" D. n# {) s  p        return false;
# W4 \, B8 W: V0 a. {7 i    }9 w& {4 t# D. Z! x, M# E5 d9 N
+ D/ s+ l! R% M! \" X; h& a
    function phraseProof(string memory phrase) public view returns (bytes32) {
  ^+ N7 W7 y1 P6 u2 h( S' W; j        return sha256(abi.encode(phrase));
) l, K" j3 w$ D% v. k& e    }- M* A; n5 W* ?6 a( W( N5 N

! d! C* R( v0 s4 h. O' B    function getTradeMarkData(string memory phrase)
& [" z* b% M2 [% Y        public view returns
" O; |$ |4 p, D! D- d        (string memory document,
* `9 l7 P( q" w% b         string memory authorName,
6 `" B5 R0 y2 X( x- g         uint256 timestamp, 3 i$ q! z3 t+ Z, I8 n0 f2 E( }/ A
         bytes32 proof) {: y: l7 N& p3 Y) i
        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];
5 z7 O: V0 w6 B2 c6 V4 q/ U& i, b        return (t.phrase, t.authorName, t.timestamp, t.proof);( ]) K. M0 J& T6 k  o* Y8 a
    }
- P! d/ f% _! K3 i7 i}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。
6 Z  B4 D. Q; R7 `, `我们将通过运行以下命令来编译此智能合约:+ S2 A& B/ s" C9 h2 P' y; v, i
truffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。 ( q$ d" r, I- ~( N) @7 ^' x- y
现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:) B- Y5 }: B) d, v- L
var TrademarkRegistration =
# K* }7 n$ h; f# D. V( _    artifacts.require("./TrademarkRegistration.sol");% e/ I" v# R* l) q# Y: V

0 \) g; R, o* Y9 q! q& H) smodule.exports = function(deployer) {* @  J" U+ _! B) I" n
    deployer.deploy(TrademarkRegistration);
7 W+ a3 d4 ?6 d4 E2 q1 F/ i};
) E4 m$ _( `0 X0 ]) w保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。
( @$ |3 M7 i+ u0 p1 W% g8 M' Q首先请运行以下命令:
; U1 f2 |  W: g' v5 ctruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:7 |7 d! B% e, |) D0 v' y
2_deploy_contracts.js* r6 I! W# E/ E4 l2 G
=====================
: B7 Z' Q' }; ~" u9 bDeploying 'TrademarkRegistration'0 Z. U; A- ^7 Q  u4 `. V" y. g( Z8 g
---------------------------------   
0 Y, g4 N. j1 K* w" R6 \> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   & @" i" x- Y7 y; M2 s, a, S
> Blocks: 0              Seconds:4                              
+ \4 `3 K  ?2 p> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12; U6 o, A& A  \: i$ |
> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A
* m; i  l( G* ~! y3 g> balance:               9999970.000876312, T- m9 w* I3 _- e( ]
> gas used:             932772
$ f7 |( |* ~, ^, m> gas price:             20 gwei
4 W; f' R" e$ E, {> value sent:            0 ETH
, V( z3 J+ T1 }! q: |7 a. n" N> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。 $ e6 R7 g8 ^- A1 D3 i# W
现在可以测试我们的智能合约了。
; x# m3 {: n+ ^% l5 e 运行以下命令跳转到Truffle控制台:
" L" j9 D" K% X% }6 q$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:+ c  ^3 v* B! Q
truffle(development)> let trademark = await TrademarkRegistration.deployed()
8 P& y. i/ B" p8 [8 Xundefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。# B, a  j0 U) p& l
truffle(development)> trademark& z$ {) |( _; A3 G8 e
TruffleContract {
2 y: M" [9 {: ~9 O* X3 u' w( M  constructor:
% |; M$ h! o% P1 `5 k% H   { [Function: TruffleContract]4 c4 e$ p" G1 |4 h
*
; a$ Q9 s, F: g8 J  \*& B: {* z% ?) h" O' T( ^
*
. j. M! b% z" E! j' c$ y  send: [Function],. Z4 a0 e$ K) i  Q$ w" E
  allEvents: [Function],* X" J9 ~. N6 z4 m
  getPastEvents: [Function] }请键入以下内容来检索地址:
" h0 h  m$ `; S) |" w# [- [truffle(development)> trademark.address6 S: ^& F; J/ U' i9 N4 m
'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。0 X1 h( v% A! ?# j2 F0 A
先来检查一下商标是否已注册:7 A1 e' l0 c$ d4 d; C
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")
: {2 T2 d, |6 T, A& r; Vfalse太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。( R) u7 D* a  @. P7 ^. V  g# x2 p+ O
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")$ m4 n7 ~+ L+ l% U1 m; ~* z
{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',3 n4 ~1 V: s2 \0 {+ [( Z$ l
  receipt:
1 F0 u  X( W, q   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
6 ?# W% L. _+ t) i     blockNumber: 250684,; V- U5 f+ C+ w0 b6 K
     contractAddress: null,9 v3 I% F7 {5 V
     cumulativeGasUsed: 27024,; K: U% i" B, n5 ]0 P
     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a'," ]8 \3 S; H! `* S: h1 p. u
     gasUsed: 27024,' I: }! z5 F7 T: j0 b( y! g
     logs: [],
2 w) |. g6 u1 b% {- K4 l     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',- X. y0 P1 O% Q0 q: k9 ]: c
     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',8 j7 t' c0 d: e
     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',! G$ d+ U& K0 ?3 D
     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
8 U. \( e* B0 N) F. N+ P, o     transactionIndex: 0,9 r# v0 D& r) ?& U
     rawLogs: [] },
' E5 _& S1 ]! L: `7 r  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2