Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
Kotti是最新开发出来的以太经典权威证明(PoA, Proof of Authority)测试网络,我们现在就来花一些时间来了解它吧。Kotti是Goerli项目的一部分,该项目主要在以太坊和以太经典上开发POA测试网,得到了ETC Cooperative的资助。
8 J- E& s$ U' t我们将在本文介绍如何向Kotti部署智能合约。
% _* z5 f5 b" _# m6 s+ L" Z此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。( _, j& [$ o- E
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。
7 L; c- B' B) P- I* H运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。& D- D& g4 R( x
我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。
) O+ o/ g7 n! P- ^0 y. K: ?, z# ~' K$ git clone https://github.com/ethoxy/multi-geth.git
9 E2 T3 K+ J& y( `" {8 Q$ cd multi-geth
- f2 f) h* M8 P2 z# T$ n$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。
' v7 z' I; G  C1 e在multi-geth目录中使用此命令运行Kotti:
$ L3 b: f2 W* |$ ./build/bin/geth –kotti4 P$ P6 r) [1 d

; [4 A7 Y7 Z9 v/ A0 e/ l5 c  l现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。( i) J/ C& l( H6 q
在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:' c. W* v7 m) U7 s
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。
9 h, ^# N8 v" a: s现在我们开始创建私钥。3 n. `. S9 b  N
在Javascript控制台中,首先运行以下命令:1 A: Y# x/ w6 C6 A$ L
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。
" F0 p+ N0 j# X, D2 [; u这个帐户稍后将用来部署智能合约。2 h; a) y7 \  z( P+ C6 B
目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。. i+ H2 ]) |+ y" Q
$ f7 |! L, `" t6 X
4 P3 V6 E' m6 _7 P3 j0 ?9 b
注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:& h8 x( }1 [8 d2 q8 D: p2 ^0 I
> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:" s0 Q6 N: v& _5 t/ s- M
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
9 `4 {6 R9 J& d* j# [8 U" A' k% u9 S现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。7 N2 w  v" _9 U- M
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。2 V+ J7 g( v7 {* Q# U3 W. \
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。
- k* C. s; r" k" }# l这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。( _% h' P8 z# M
我们将使用Truffle在Kotti上部署我们的以太经典智能合约。
3 ~- v+ Y& N+ Y4 {2 `" r2 [  e首先,需要在计算机上安装Node.js和NPM。
) I: P! g* g, H" E1 q我们将首先通过以下命令安装Truffle(可能会需要sudo):
* F, {, G* r2 K# c0 w! D* p$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。
0 [2 q: N. Z! Q( G  S; B" w9 {它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:
" o* \" S" \$ Z& @2 K3 r6 U9 w& ~$ mkdir kotti-truffle && cd kotti-truffle
6 x7 I. T( L( d  Q/ n$ _$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
; X1 i4 s7 X9 [" Q+ w 至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。4 g# M: }1 B! D% d$ u: e
在目录中键入ls,可以找到truffle-config.js文件。
7 S8 w. g3 m2 q' Q3 s/ M2 f3 ^6 I3 k  l用你喜欢的文本编辑器打开它(这里我使用的是vim):. I! p- m8 r, i
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。: r/ O. e* T0 O# }0 a+ D. d$ K6 `
删除truffle-config.js中的内容并添加以下内容:( Z2 Y3 r. m- |. w- `
module.exports = {
& |1 ~# }1 g, m' p: ^+ |  networks: {
) ]3 [/ X; k$ u6 L# w      development: {
# t+ a/ G3 U! L' M+ t8 X: C2 c; n      host: "127.0.0.1",  // Localhost (default: none)
: s# \- u2 g8 M+ M  J/ D      port: 8545,        // Standard Ethereum port (default: none)
* g1 m$ P. g$ ?6 |- d      network_id: "*",   // Any network (default: none)
/ l  A* V1 H" [" d; P# j$ D     } ( e7 K; m" M! k
  },
& s3 a$ n' |3 W0 ~- j  compilers: {% S, k$ @4 q6 i4 z' N3 i
    solc: {
3 G8 q7 l, p( M3 t, o/ A      version: "0.5.1",   // Fetch exact   version from solc-bin (default: truffle's version)" q) }8 B+ S4 ^8 R4 |+ S' J( Y: C
       settings: {        // See the solidity docs for advice about optimization and evmVersion
3 J& X- v' k) y. C# E! @        evmVersion: "spuriousDragon"
- y" Z: M8 b6 |6 [! |      }
# O( j  a0 |5 [0 W6 Z, F    }
* B  Q  }1 \+ b6 F3 U5 r% H  }  u  j: b1 A8 d: g* F  Z
}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
& L/ n6 Q. G. l% W* N, W1 Y! A我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。0 ~) ~3 v7 L5 M. ]2 h2 m! q/ n9 h
运行以下命令:
: r8 E" T2 V& Q. N  s1 @truffle console如果控制台内出现如下内容:( j+ t; b. B6 `2 V0 k
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。8 r+ s8 c  w  }: l
现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:) @7 P# y0 o, m4 J
pragma solidity 0.5.1;
7 a: q3 c+ i- N4 u+ N2 i5 xcontract TrademarkRegistration {
. F( f" P! Z; c/ g7 i" W    struct TradeMark {
, t7 L. P1 A6 s! ?2 B/ B        string phrase;
# h0 E) b! J8 i8 r0 C2 _6 r        string authorName;
4 H, q/ F2 b/ D" d! r        uint256 timestamp;
1 x3 j; U# {8 r: m- \        bytes32 proof;% B  I- `; J: y; y' ~" {. Y& u
    }1 W! [- g! v# W" ~& u8 l& T
# V" X6 W) u3 T! R  r" O/ E
    mapping (bytes32 => bool) private trademarkLookup;, @- l# @6 B& v% W9 q: n) a# S
    mapping (bytes32 => TradeMark) public trademarkRegistry;$ g0 J5 J# n8 Y( y( g
      p% h6 t# P- h' k
    function checkTradeMark(string memory phrase) public view returns (bool) {2 `, W) L9 t' l9 K
        bytes32 proof = phraseProof(phrase);2 R) @0 `6 d( d% I1 Y0 s) M6 l
        return trademarkLookup[proof];4 K2 u2 H' D/ K5 A" g
    }
& F5 J: X5 Y. R+ M. F" G! F; W. W; F ; b$ q9 j& _" X. ~3 Z$ P! l
    function registerTradeMark(string memory document, string memory author) public returns (bool){4 I6 [( N* c3 c8 g5 [
        if (checkTradeMark(document) == false) {
- \5 {: y4 ]8 y) c            bytes32 proofHash = phraseProof(document);
( `/ {. t# c8 X/ Z3 g& c6 T            TradeMark memory trademark = TradeMark({; I9 r. W( G4 O
                phrase: document,
2 y3 {# M2 ?. c; ^                authorName: author,. o; @( g" `2 u/ N- l0 u+ X/ h
                timestamp: now,
" m9 c3 h! r' I. `, w" g0 t                proof: proofHash( K$ K6 K5 c1 a+ n! a
            });( u/ k3 U4 N2 D. ?8 f" v6 ~
            trademarkLookup[proofHash] = true;
9 ~. U7 V% A0 J6 c& u+ v( G$ \0 B" i            trademarkRegistry[proofHash] = trademark;
/ F% c  i, B$ i: b5 T  X            return true;1 C* ?5 e* j% X7 a
        }" L* L5 ], j7 o& ?3 k
        return false;
' s) L. l# g$ N8 Y" b    }  u9 m# }/ Y- O4 `0 @6 I% M& ~
" I8 S- v' n, u  Z
    function phraseProof(string memory phrase) public view returns (bytes32) {! N: p5 m7 A. h( J. Y% }7 M
        return sha256(abi.encode(phrase));) d& T( f' [; |+ x0 l! w
    }
/ ?8 T$ U5 B1 W9 a4 m" K 6 O2 {6 j  w0 Q3 ], [( }
    function getTradeMarkData(string memory phrase)
2 O- N! E( F" m; A2 T! X; I: q/ i5 }        public view returns
3 [/ V7 [. N+ f        (string memory document,
1 j: F+ d" Z' q4 a% \$ `, [+ `) t) u         string memory authorName,
6 H6 h& j- D, S- E1 D         uint256 timestamp, 6 I" U: p6 u$ h# s% c: s9 ^$ @" H
         bytes32 proof) {
$ x/ |% w- b7 w$ E( P/ L- ^) h        TradeMark memory t = trademarkRegistry[phraseProof(phrase)];! W& K, ]6 ?4 p# {
        return (t.phrase, t.authorName, t.timestamp, t.proof);
$ \+ X  i' \( h# Q) k    }
9 A9 a# ~  ?- w2 b2 B}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。) L7 K) S7 I' {8 K4 C* l( `
我们将通过运行以下命令来编译此智能合约:0 k# t, ?  k! H6 c% p! w* W
truffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
$ D1 `/ B0 R7 F$ Y% D现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:
( ~3 ^3 o5 {6 t# l( Y) v- v: Qvar TrademarkRegistration =) e: R9 B5 T; h
    artifacts.require("./TrademarkRegistration.sol");. j6 |3 ^& N% w' K& y( ^5 w

  ^+ D4 K# i2 a9 q+ wmodule.exports = function(deployer) {
+ L* `7 O0 H0 N% v+ }! N& l    deployer.deploy(TrademarkRegistration);5 k0 n! n( [) T+ w
};
1 ~8 F: l7 B* V8 i) q9 m7 o保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。" s2 Y8 G. k  [; n
首先请运行以下命令:
# G: \* X$ D* R! u4 ~* i" f, htruffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:
% ]/ J/ t4 }; O5 J4 I$ y8 t2_deploy_contracts.js
4 ~: I+ L6 ?1 ~. _/ C=====================/ S- w# |3 {2 v
Deploying 'TrademarkRegistration'9 C5 K* i8 p4 M1 k" S
---------------------------------   8 A. |* P" A* g8 |- ]
> transaction hash:    0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea   0 L( C4 u0 Y* L0 R  |6 v
> Blocks: 0              Seconds:4                               ' H1 A4 r; l" g
> contract address:   0xe85B0637437A926B2ce437492Bc118E7E7F6EF12
( ]; X. m, B$ }> account:               0x25B7955E43Adf9C2A01a9475908702Cce67f302A+ C# S8 H# d: y* J. T$ v
> balance:               9999970.000876312
( v7 C2 A' v6 k! m& _% f> gas used:             932772
6 b3 z7 {5 _' n( ~4 ^> gas price:             20 gwei
/ q# ], G1 _  d- }> value sent:            0 ETH, u, x- `/ o6 n$ D: b' N1 I* l, u
> total cost:            0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。
' B, f" s* n' o6 s; X现在可以测试我们的智能合约了。
& r) n, R$ c) X" O' h& M3 t 运行以下命令跳转到Truffle控制台:
* G. P! J8 e/ V6 `$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:" F3 }4 ?! u) K7 t  J8 i+ D1 S5 ^
truffle(development)> let trademark = await TrademarkRegistration.deployed()+ j- o3 E# d, Q+ T  L% C9 V: O+ q
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。
  v$ ]) t2 N8 N( ^' F# W3 u2 B. ztruffle(development)> trademark4 |/ @6 [$ v* P+ c
TruffleContract {' z0 ^% w8 w, u& @: Y8 J0 j/ O( _
  constructor:
# B* A7 P( A2 Z/ z: {' M& Q   { [Function: TruffleContract]1 O# c# S8 u. D4 C$ W
*4 A% v% d' }0 q" ]; z9 D
*
- d! d1 a  r8 T/ O' F*
- q$ H6 g7 B4 c* u6 r4 N' z  send: [Function],, d! ?3 d/ @' b# n6 o, f1 w
  allEvents: [Function],5 _' a! R0 B$ a8 ?1 s, {+ x
  getPastEvents: [Function] }请键入以下内容来检索地址:9 `  j2 ]7 x3 A4 _% J
truffle(development)> trademark.address0 D3 f0 _5 z; v8 j) m8 S; N
'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。8 P, y: @2 a) V% w+ f/ G  C: D
先来检查一下商标是否已注册:' I& F$ [, y( b. H& U% L: H$ G; Z, `
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")
9 A+ F7 N% s) I; Y' h" ~false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。2 c$ v0 Q  z& I6 |+ D) g* @  V  r
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")4 v% B  H! Z* `6 I$ v
{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',+ j' j( V# ^! q8 e2 _+ k4 |* d/ \
  receipt:" a6 m' E- K9 a# E2 D! S: J
   { blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
. T/ `) E: w( {3 k7 x  I     blockNumber: 250684,
* s2 q* L% t6 i+ L0 m     contractAddress: null,
; G: Y$ G- ]  c' R( Q     cumulativeGasUsed: 27024,$ @( w3 v; h# p1 ^0 ]0 l7 K
     from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',
0 \2 {0 n$ e% ]5 T) {     gasUsed: 27024,
7 g0 U* J& q# y     logs: [],& P% Z% P+ e6 S* `) P1 @* o
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',/ j( b9 }/ h2 Q0 E# V+ g
     root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',
. r- V0 d) X  R3 J# |3 P% K     to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',
4 \0 b- Y' F2 b     transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',1 t& U" v: O* u) J5 N/ _
     transactionIndex: 0,
: i$ ^" O& N: M  l" C, F1 r     rawLogs: [] },: i1 r+ a$ a8 n" N$ F( y  P" T$ w
  logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
标签: Solidity
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

金光2017 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2