如何在Kotti测试网上使用Solidity创建ETC智能合约
金光2017
发表于 2022-12-29 13:03:19
102
0
0
我们将在本文介绍如何向Kotti部署智能合约。 ; v4 W. l! v# a# ~/ x3 _9 U6 |
此外,在以太经典开发人员唐威(@sorpaas)的指导下,我试着使用最新版本的Solidity来明确EVM与以太经典兼容的部分。没错,这样一来,以太经典开发人员就不用受限于Solidity的0.4.20版本了。- M& N( W( b' G! j, i
本文将向大家展示如何开始使用Kotti并利用最新的Solidity进行以太经典开发。请大家在Twitter上@我(Yazanator)并注明自己的Kotti地址,这样我就可以给你们发一些测试用ETC。& N' G0 y3 l9 _
运行KottiKotti目前可通过Multi-Geth获取,后者是Geth的分支,运营着涵盖以太坊和以太经典的多个EVM网络。1 n' _+ h+ j8 f4 x( @# L- O! C
我们首先需要克隆并安装Multi-Geth存储库,请按照一下说明由Github来安装Multi-Geth。- f1 \0 M$ Z0 I( P7 U
$ git clone https://github.com/ethoxy/multi-geth.git
$ cd multi-geth
$ make geth这一步需要运行Make来安装geth,从而生成一个位于build/bin/geth中的可运行的二进制文件。1 _9 N& c5 |8 U: a0 X* z
在multi-geth目录中使用此命令运行Kotti:
$ ./build/bin/geth –kotti
现在Kotti已经在我们的终端上运行了。那么我们接下来要创建一个密钥和一个帐户。
在Kotti运行时,打开一个新的终端窗口并在Multi-Geth目录中键入以下内容:1 ]% x |$ A" U6 a5 M( [% e! Q
$ ./build/bin/geth --kotti attach这样就可以将你与自己之前运行的Kotti实例联系起来,并允许你在Javascript控制台中与其进行交互。: t1 ]* r. x3 ?9 r9 y6 ]9 d) r0 e
现在我们开始创建私钥。3 e& c; }2 y6 D/ V% z: o
在Javascript控制台中,首先运行以下命令:: r4 J K; J: u
> personal.newAccount()这样就开始创建新账户了。首先需要设置密码,请输入一个自己记得住的密码,然后再重新输入一次进行确认。接着它会为你的账户提供一个公共地址。
这个帐户稍后将用来部署智能合约。. F4 n9 G- T& i7 C9 U! B6 J1 q& f
目前还需要的一样东西就是Kotti ETC。你们可以在Twitter上@Yazanator并附上自己的Kotti地址,这样我就可以发一些给你们来进行测试。
" }: ~7 Z& F9 w y3 b2 _+ T( y8 K2 z
注意:如果你的地址已经有了Kotti ETC,并且想将其发送到另一个地址上,那么只需在Javascript控制台中运行以下命令即可:
> web3.fromWei(eth.getBalance(ADDRESS), "ether")其中ADDRESS就是你当前的地址。此命令会检查你的余额,并返回余额内容。如果你想将一些Kotti ETC发送到您之前创建的帐户中去,那么可以运行以下命令:
> eth.sendTransaction(ADDRESSA, ADDRESSB, web3.fromWei(10, "ether"))其中ADDRESSA是发送方地址,ADDRESSB是接收方地址。
现在,无论你的ETC来自另一个地址还是来自我这里,都可以开始正常操作了。9 [; `( c0 y. b0 H( j
此外,当你接下来要利用Solidity 0.5.x版本在ETC上部署智能合约时,并不一定非要使用Kotti了。你也可以连接到Morden或主网络,但在那些地方你的账户里必须要有真正的ETC了。2 y' N+ M$ |9 g$ x
Solidity 0.5.x与以太经典有意思的部分要开始了,我们现在要把利用Solidity最新版本创建的智能合约部署到以太经典上。
这里要注意的一点是,我们所提到的EVM是拜占庭分叉前的版本。+ \5 K' a) D: G# q! N! w! H
我们将使用Truffle在Kotti上部署我们的以太经典智能合约。
首先,需要在计算机上安装Node.js和NPM。9 M, `3 h; \/ L; }3 d
我们将首先通过以下命令安装Truffle(可能会需要sudo):; b& G( A1 T0 N
$ npm install -g truffle完成安装后,通过键入truffle来检查它的安装情况。4 T( c, [4 {& v; o. s' _7 C
它应该会显示可在truffle中使用的有用命令。现在,我们来展示一个truffle目录:$ ]# K9 ]% o. J% z
$ mkdir kotti-truffle && cd kotti-truffle. u% Z9 `2 Q+ R K& Y( f0 M
$ tuffle init这样我们将在名为kotti-truffle的目录中初始化一个truffle项目。
至于truffle在这里的作用我就不进行深入讲解了,我们只要了解如何编译和部署以太经典智能合约就可以了。2 a4 c+ t7 u$ W; g
在目录中键入ls,可以找到truffle-config.js文件。
用你喜欢的文本编辑器打开它(这里我使用的是vim):" x- p; [+ K) W5 T
$ vim truffle-config.js在这里我们需要使用与ETC兼容的EVM版本,即拜占庭分叉之前的版本,spuriousDragon可作为候选。7 @ S3 j1 J2 `3 U3 ~8 @: `
删除truffle-config.js中的内容并添加以下内容:
module.exports = {, M+ J/ i1 J& l( k0 T6 p; i
networks: {
development: {8 X8 d* b: k7 a, Z5 z
host: "127.0.0.1", // Localhost (default: none)1 n m: Z% Q" \' y* Q7 @! x
port: 8545, // Standard Ethereum port (default: none), C) A E* t! Y0 O
network_id: "*", // Any network (default: none)5 J6 R1 P; D; `8 I
}
},
compilers: {, S1 j4 l% U$ |
solc: {$ A; S0 ^' R/ A6 o5 b
version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version)
settings: { // See the solidity docs for advice about optimization and evmVersion& Q: k2 J3 d6 {7 ]
evmVersion: "spuriousDragon"
}: F! n) f0 @" \: d; ~
}) k: |% j/ g+ R3 H
}' h( |) q5 K9 l
}这里我们使用的是0.5.1版本,大家也可以在其他版本中进行试用。我将提供的智能合约代码尚未在后续版本中进行测试,因此你们可能需要为那些版本对其进行重构。
我们来测试一下truffle是否可以连接到Kotti(在localpost的8545端口运行)上。( v+ I0 i, c1 C2 n$ o8 U$ u
运行以下命令:) f \! H3 c$ a0 P2 i* {1 U2 g4 m
truffle console如果控制台内出现如下内容:- z) G4 \* j2 P& ` k
truffle(development)>这就意味着已经连上了Kotti。键入.exit退出控制台。& }# A* Y0 K8 G: H
现在,我们来添加智能合约代码。我们将使用的智能合约版本可按照以下步骤找到:
pragma solidity 0.5.1;
contract TrademarkRegistration {
struct TradeMark {, w% O3 y8 f% O6 G- C% [$ E
string phrase;
string authorName;
uint256 timestamp;
bytes32 proof;
}, c# ~8 v# P0 a( M+ J7 z% I1 Z
mapping (bytes32 => bool) private trademarkLookup;8 M* O. S5 \# i$ j
mapping (bytes32 => TradeMark) public trademarkRegistry;# u7 R5 \/ M; p( x4 X) K
$ r& A+ j7 J( x- b5 q! U
function checkTradeMark(string memory phrase) public view returns (bool) {; f& y$ X0 @ m* J
bytes32 proof = phraseProof(phrase);
return trademarkLookup[proof];' f9 m9 [) T. f
}
; B) D, ^7 ?: U; X' a6 [# l( ^/ A
function registerTradeMark(string memory document, string memory author) public returns (bool){
if (checkTradeMark(document) == false) {3 R( t2 k }( k. S
bytes32 proofHash = phraseProof(document);
TradeMark memory trademark = TradeMark({
phrase: document,
authorName: author,
timestamp: now,
proof: proofHash
});) W; `8 h* `9 b+ A
trademarkLookup[proofHash] = true;- h7 p$ h' d4 d- R" {, b: x- u& T
trademarkRegistry[proofHash] = trademark;
return true;
}
return false;
}' k2 F9 `# \# G& m9 a( u( d
function phraseProof(string memory phrase) public view returns (bytes32) {
return sha256(abi.encode(phrase));% b6 \& N) J) P' E/ `
}1 @ t. L6 O$ l. _
function getTradeMarkData(string memory phrase)
public view returns
(string memory document,
string memory authorName,
uint256 timestamp,
bytes32 proof) {
TradeMark memory t = trademarkRegistry[phraseProof(phrase)];! f. D' k0 w( u8 s6 o- s
return (t.phrase, t.authorName, t.timestamp, t.proof);
} q! F9 R8 N& [# h5 }
}将此智能合约复制到你的Truffle项目内的contracts/里去,文件名为TradeMark.sol。/ T; W0 _ o7 e$ l
我们将通过运行以下命令来编译此智能合约:7 p X4 Y8 M% d$ q' C- ?( G+ B
truffle compile编译智能合约之后会生成一个包含字节码和ABI.json的build目录。
现在,我们来修复迁移内容,以便迁移我们的智能合约。在migrations目录中,使用以下内容创建名为2_deploy_contracts.js的新文件:$ a. u( B: W' |
var TrademarkRegistration =! j: M C0 Q; W$ c5 `" ~1 [; l
artifacts.require("./TrademarkRegistration.sol");* J1 O. M" V8 C6 s
module.exports = function(deployer) {- I6 r8 Z, ^* O. [. y$ D1 o8 m
deployer.deploy(TrademarkRegistration);& B- l' E" z# ~$ w+ M; F& o
};2 ~1 g+ W; i- w( ~3 \/ m. D$ @
保存后,我们就可以开始将已编译的智能合约迁移到Kotti上了。3 k. p+ g6 H$ ]8 O$ V2 Q5 q* O
首先请运行以下命令:
truffle migrate这样就可以在Kotti上部署智能合约了。它还将显示智能合约地址的位置以及部署智能合约所需的Kotti ETC数量,甚至还提供交易哈希。执行迁移时的Kotti输出如下:2 s! [; @* f; ^& P+ q2 U5 T
2_deploy_contracts.js
=====================
Deploying 'TrademarkRegistration'
--------------------------------- - y3 }. ?5 c/ l7 T$ H
> transaction hash: 0xe7b98909941a69e82e44717e735c023d0403fbc5a870fe5c9e19258a24c7d3ea 1 _. ?! b1 c5 o! ~( I' @
> Blocks: 0 Seconds:4 ( {( p2 C2 }6 N. H. R
> contract address: 0xe85B0637437A926B2ce437492Bc118E7E7F6EF123 C. \( l" p, B! F9 X
> account: 0x25B7955E43Adf9C2A01a9475908702Cce67f302A
> balance: 9999970.000876312
> gas used: 932772+ w- B+ T8 m3 P1 @9 v& P
> gas price: 20 gwei# M: T$ j( D9 w# d. L3 W
> value sent: 0 ETH9 j5 D- Y# v1 s L, e" L
> total cost: 0.01865544 ETH对于把这些内容分享出去我并不感到担心,因为一切都还在测试网上。我们有合约地址,当我们在Kotti上与已部署的智能合约进行交互时会使用。 . X' r9 r" E% K1 Y
现在可以测试我们的智能合约了。( f- J/ S) p$ C7 `, T- _
运行以下命令跳转到Truffle控制台:9 W3 E4 D9 Y: T" C5 F
$ truffle console这样就可以进入Kotti环境了。我们来创建一个可变商标,以通过之前给我们的地址展示智能合约:+ Z/ p* T# Q% p; G+ f3 ?; ~0 u
truffle(development)> let trademark = await TrademarkRegistration.deployed()
undefined这为已部署的合同TrademarkRegistration分配了可变商标。如果我们输入trademark,我们将获得智能合约的所有信息。, N6 M: q# b: O5 b4 p, ]7 {
truffle(development)> trademark
TruffleContract {& V! d3 V5 o: R! O5 P& }* y% \
constructor:
{ [Function: TruffleContract], f2 u6 ^$ @: a- R
*
*
*# H9 d$ L3 C$ g8 i; i; f
send: [Function],
allEvents: [Function],1 U1 R7 I9 ~( x. t+ Z& M1 l; B! O
getPastEvents: [Function] }请键入以下内容来检索地址:
truffle(development)> trademark.address- b0 V! ^* {: e: w+ q
'0xe85B0637437A926B2ce437492Bc118E7E7F6EF12'现在,为了证明这个智能合约适用于0.5.1版本的Solidity,我们来与它进行交互,看看会出现什么情况。
先来检查一下商标是否已注册:5 v8 e8 s: _3 m( l& S+ D
truffle(development)> trademark.checkTradeMark("ETC Take My Energy")
false太好了,现在你已经拥有一个在以太经典上运行的Solidity v0.5.1合约了。然后我们要通过Kotti账户余额进行交易来注册商标。! W; |6 g% k/ L; Q8 e' T7 ~& P2 u
truffle(development)> trademark.registerTradeMark("ETC Take My Energy", "ETC")5 ?1 J; d+ g# G0 y+ q* b1 U
{ tx: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',, n( o4 p' A5 [2 G+ L6 x4 n: Y
receipt:2 o# i( }* f. A) G. E s
{ blockHash: '0xbaa0cbb48498ac1fe695fce9d6ec8c4a251677481648ce3dbde075cbc8cb0d7a',
blockNumber: 250684,. f" g+ D: ?+ V
contractAddress: null,: _% {+ ]" ^. _ L3 r( q& `! {
cumulativeGasUsed: 27024,) [; j6 y$ J. j3 L$ h8 ]
from: '0x25b7955e43adf9c2a01a9475908702cce67f302a',- ~* w" V! F$ e/ W+ L) A: H
gasUsed: 27024,
logs: [],, N+ V6 a8 {1 b" K V
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',1 W; s o: R b
root: '0x8f534f7f0b344e99f3e4800ff87ebde917b8180c1bc5d2e462e7473e5b76b895',! H. ^# M2 P# |+ a
to: '0xe85b0637437a926b2ce437492bc118e7e7f6ef12',
transactionHash: '0x3dbf55f52bea595eaf41c9eaa67cce30319ce79f0bc599eedb0ce9f1c6b36de0',
transactionIndex: 0,
rawLogs: [] },
logs: [] }可以了!太棒了!就这样,我们证明了ETC可以在Kotti测试网上运行对接spuriousDragon版EVM的Solidity v0.5.1智能合约。希望大家喜欢这篇文章,也请大家积极尝试。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
成为第一个吐槽的人