18910140161

区块链技术之以太坊教程:搭建环境 编写编译一个智能合约

顺晟科技

2021-06-16 10:47:01

157

本Ethereum教程主要介绍:搭建开发环境,编写智能契约。

什么是以太博物馆

以太网是一个开源的公共区块链平台,具有智能契约功能。一个分散的虚拟机(“以太网虚拟机”)由其特殊的加密货币以太网提供,以处理点对点合同。

以太网(Ethereum)的概念最早是由程序员Vitalik Buterin于2013年至2014年提出的,受比特币的启发,具有“下一代加密货币和分散应用平台”的一般含义,2014年开始通过ICO众筹发展。目前,以太网是市值第二高的加密货币,仅次于比特币。

什么是以太网区块链?

区块链艺术博物馆有两个主要组成部分:

数据存储:网络中的每一笔交易都存储在区块链。当你部署一份合同时,它就是一笔交易。当你执行合同功能的时候,就是另一个交易了。这些交易都是公开的,每个人都可以看到和验证。这些数据永远不能被篡改。为了确保网络中的所有节点都有相同的数据副本,并且没有无效数据被写入区块链,以太网使用一种称为工作负载证明的算法来确保网络安全。

代码:在数据层面,区块链是一个存储事务。在Ethereum的世界里,你可以通过一种叫做Solidity的语言来编写逻辑/应用代码(也就是智能契约)。然后使用solidity编译器将代码编译成Ethereum字节码,并将字节码部署到区块链(还有其他一些语言可以编写契约,但solidity是目前使用最广泛、相对比较容易的选择)。所以Ethereum不仅会存储交易数据,还会存储和执行智能合同代码。

可以简单理解为区块链以太网的功能是在EVM存储数据和代码并执行代码(以太网虚拟机)。

需要准备的基础知识

为了开发以太网,您应该对以下语言/技术有基本的了解:

熟悉一门面向对象的语言(比如Python,Java,go)

HTML/CSS/Javascript

基本命令行交互,如Linux外壳命令

了解数据库的基本概念

为了在Ethereum中构建Dapp(分散应用程序(DAPP)),Ethereum有一个非常方便的JavaScript库(web3.js)。也可以直接把这个库引入到一些js框架中来构建应用,比如react、angular、vue等等。

例如:以太网投票应用程序

在以太网教程示例中,我们将构建一个简单的分散投票应用程序。分散应用程序是一种不仅仅存在于集中式服务器上的应用程序。网络中数百台计算机上运行的应用程序有许多副本,这使得停机几乎是不可能的。您将构建一个投票应用程序,在其中您可以初始化选举候选人并为候选人投票,这些投票将记录在区块链。你将经历写投票合同、将它部署到区块链并与之互动的整个过程。您将了解什么是合同,以及将合同部署到区块链并与之互动意味着什么。

本质上,区块链就像一个分布式数据库,它维护着一个不断增长的记录列表。如果您熟悉关系数据库,您应该知道一个表中有许多行数据。现在,数据被分批处理(例如,每批100行),并且每个被处理的批被连接。你可以组成一个区块链!在区块链,每批数据称为一个块,块中的每一行称为一个事务。

既然你对Ethereum有了基本的了解,我们就可以开始构建投票dapp了。这将增强你对以太网的理解,并对以太网的功能有一个初步的了解。

以太网开发环境的建立

Linux操作系统

例子是Ubuntu 16.04下学习环境的构建。您只需要成功安装nodejs和npm,然后就可以继续项目的下一步了。

安藤仁npm(消歧义)是吗赢了你好web3吴登盛吴登盛吴登盛。张永强张永强solc(消歧义)范希阳(音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同)。

孙悟空呢:

$ sudo apt-get更新

$ curl-sl 339 deb。nodesource。请访问Microsoft.com/setup _ 7。x-o nodesource _ setup。嘘

$ sudo bash nodesource_setup.sh

$ sudo apt-获取安装开发

$ node版本

7.4.0版

$ npm版本

4.0.5版

$ mkdir-p ether eum _ voting _ dapp/第1章

$ CD以太网_投票_ dapp/第1章

$ npm安装ganache-cli web3@0.20.1 solc

$ node_modules/.bin/ganache命令行界面

你好,你好啊node_modules/.bin/ganache CLI,-你好-你好。

ganache CLI v 6。0 .3(ganache-core : 2。0 .2)

可用帐户

===ytet-伊甸园字幕组=-翻译

(0)0x 5 c252 a 0 c 0475 f 9711 b 56 ab 160 a 1999 729 EC c97

(1)0x 353 D3 d 310床379 B2 D1 df 3b 727645 e 1999 7016 ba 3

(2)0xa 3 DDC 09 b5和49d 654 a 43和161 ca E3 f 865261 CAD 23

(3)0 xa 8至188 c6d 97 EC 8 cf 905 cc 1 DD 1 CD 318和887249 ec 5

(4)0 xc 0 aa 5 F8 b79 db 71335 dacc 7 CD 116 f 357 D7 ECD 2798

(5)0 xd 69959 ff 85 f 0581 ca 924和549567390 a 0034058

(6)0 xd 4 ee 63452555至87048dcfe2a039208d113323790

(7)0x 60 c8至7b 752 d38及35e 0359及25a 2及0f6692b10d14

(8)0 xba 7 EC 95286334 e 8634 e 89760 fab 8d 2 EC 1226 BF 42

(9)0x 208 e 02303 Fe 29 be 3698732 e 92 ca 32 b88 d80 a 2d 36

私有密钥

===ytet-伊甸园字幕组=-翻译

(0)9563 d3d 157和9926 a 993559 dc 177被74a23fd88ff5776ff0505d21fed2b

(1)17f 71d 31360 fbafbc 90 CAD 906723430 e 9694 daed 3c 24 e 1 e 9 e 186 B4 e 3 CCF 4d 603

(2)d2b90 ce 116945 c1e电弧炉081 f 60976 D5 D1 d 52 f 721 e 659887 FCE BCE 5 c81 ee 6 ce 99

(3)68e 2288 df 55 CBC 3a 13 a 2953508 c8 e 0457 E1 e 71 cd8ae 62 f0c 78 C3 a 5c 929 f 35430

(4)9753 b 05 BD 606 e 2 ffc 65 a 190420524 F2 EFC 8b 16 EDB 8489 e 734 a 607 f 589 f 0 b 67 a 8

(5)6e 8e 8c 468 cf 75 fd4从0406 a1至32819036 b9fa 64163 e 8be 5bb 6 f 7914 AC 711251 cc

(6)c 287 c 82 e 2040d 271 b 9 a 4 e 071190715d 40 c 0 b 861 EB 248d 5 a 67874 f 3 ca 6d 978 a 9

(7)CEC 41 ef 9 CCF 6 CB 3007 c 759 BF 3 FCE 8 ca 48239 af 109065 aa 52 b 703 FD 04803 c 9d

(8)c 890580206 f 0 BBA 675424246d 09 ab 4 bef 7 EEA 22 c 3448 dcb 7253 AC 2414 a 5362 a

(9)EB 8841 a 5 AE 34 ff 3 f 424886 e 73 fcb 274 a 7 F5 DD 2 DC 07 b 352 D2 c 4 b 711132 b 3 c 73 f 0

硬盘(hard disk)公事包

===ytet-伊甸园字幕组=-翻译

助记符:取消更好的惊吓夫人能够主要的酒精饮料漂移警报鸭伞

硬盘(hard disk)路径基础3330m/44 '/60 '/0 '/0/{ account _ index }

侦听本地主机:8545

嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,赢了黄公子卍10 魏冄,朱庇特朱庇特安特卫普伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇伊万诺维奇100 云娥十九世。你是谁,阿叔呀阿叔呀阿叔呀阿叔呀(阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏阿苏(以太,ETH)-你好-你好日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日/阿忠页:1。范仲淹把你的手从我的手里拿开,把你的手从我的手里拿开,把你的手从我的手里拿开,把你的手从我的手里拿开,把你的手从我的手里拿开,把你的手从我的手里拿开,把你的手从我的手里拿开,唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟/nn.

软的

(中文)中文字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译:贾宝玉字幕翻译自制的,诶哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟339 brew。sh/阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金家酿。家酿。家酿。家酿。家酿。家酿。家酿。家酿。自制啤酒!自制啤酒!自制啤酒!自制啤酒!家酿酒夏酷,是阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云。安藤仁介。

$ brew更新

$ brew安装开发

$ node版本

7.10.0版

$ npm版本

4.2.0版

$ mkdir-p ether eum _ voting _ dapp/第1章

$ CD以太网_投票_ dapp/第1章

$ npm安装ganache-cli web3@0.20.1 solc

$ node_modules/.bin/ganache命令行界面

你好npm(消歧义)是吗赢了你好web3你好。张永强张永强solc(消歧义)范希阳(音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同:音同)。

{ fnsimheibord 1 sh ad1 pos(200,288)}张永强{ fnsimheibord 1 sh ad1 pos(200,288)}张永强{ fnsimheibord 1 sh ad1 pos(200,288)}张永强,你好啊node_modules/.bin/ganache命令行界面,我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊。

ganache CLI v 6。0 .3(ganache-core : 2。0 .2)

可用帐户

===ytet-伊甸园字幕组=-翻译

(0)0x 5 c252 a 0 c 0475 f 9711 b 56 ab 160 a 1999 729 EC c97

(1)0x 353 D3 d 310床379 B2 D1 df 3b 727645 e 1999 7016 ba 3

(2)0xa 3 DDC 09 b5和49d 654 a 43和161 ca E3 f 865261 CAD 23

(3)0 xa 8至188 c6d 97 EC 8 cf 905 cc 1 DD 1 CD 318和887249 ec 5

(4)0 xc 0 aa 5 F8 b79 db 71335 dacc 7 CD 116 f 357 D7 ECD 2798

(5)0 xd 69959 ff 85 f 0581 ca 924和549567390 a 0034058

(6)0 xd 4 ee 63452555至87048dcfe2a039208d113323790

(7)0x 60 c8至7b 752 d38及35e 0359及25a 2及0f6692b10d14

(8)0 xba 7 EC 95286334 e 8634 e 89760 fab 8d 2 EC 1226 BF 42

(9)0x 208 e 02303 Fe 29 be 3698732 e 92 ca 32 b88 d80 a 2d 36

私有密钥

===ytet-伊甸园字幕组=-翻译

(0)9563 d3d 157和9926 a 993559 dc 177被74a23fd88ff5776ff0505d21fed2b

(1)17f 71d 31360 fbafbc 90 CAD 906723430 e 9694 daed 3c 24 e 1 e 9 e 186 B4 e 3 CCF 4d 603

(2)d2b90 ce 116945 c1e电弧炉081 f 60976 D5 D1 d 52 f 721 e 659887 FCE BCE 5 c81 ee 6 ce 99

(3)68e 2288 df 55 CBC 3a 13 a 2953508 c8 e 0457 E1 e 71 cd8ae 62 f0c 78 C3 a 5c 929 f 35430

(4)9753 b 05 BD 606 e 2 ffc 65 a 190420524 F2 EFC 8 b 16 EDB 8489 e 734 a 607 f 589 f 0 b 67 a 8

(5)6e 8 E8 c 468 cf 75 FD 4d e 0406 a1 a 32819036 b 9 fa 64163 E8 be 5 bb 6 f 7914 AC 71251 cc

(6)c 287 c 82 e 2040d 271 B9 a 4e 071190715d 40 c 0b 861 EB 248 d5a 671874 F3 ca 6d 978 a 9

(7)CEC 41 ef 9 CCF 6 CB 3007 c 759 BF 3 FCE 8 ca 485239 af 1092065 aa 52 b 703 FD 04803 c9d

(8)c 890580206 f 0 bbea 67542246d 09 ab 4 bef 7 eeaa 22 c 3448 dcb 7253 AC 2414 a 5362 a

(9)EB 8841 a5 AE 34 ff 3f 4248586 e 73 fcb 274 a 7f 5 DD 2d c 07 b 352 D2 C4 b 71132 B3 c 73 f 0

高清钱包

==================

助记符:取消更好的休克女士能力主要紧缩酒精衍生报警鸭伞

基本高清路径:m/44 '/60 '/0 '/0/{ account _ index }

在本地主机上监听:8545

复制代码为了测试方便,ganache默认会创建10个账户,每个账户有100个Ethers。如果你不知道什么是Ethereum账户,可以把它想象成存钱的银行账户(Ether,ETH是Ethereum生态系统中的货币/货币)。您需要使用此帐户创建交易和发送/接收乙醚。

Windows操作系统

安装Visual Studio社区版。如果选择自定义安装,至少要安装Visual C(当前版本是VS 2017)

安装视窗软件开发套件

如果您还没有安装Python 2.7,请安装它,并确保将其添加到环境变量PATH中

如果您还没有安装git,请安装它并将其添加到PATH中

安装OpenSSL。请确保选择了正确的安装包,并且只安装了完整版本(不是轻型版本)。您必须将OpenSSL安装到建议的安装位置-不要更改安装路径

下载并安装节点v8.1.2不建议将v6.11.0版与VS2017一起使用

执行命令NPM安装Ganache-cliweb3 @ 0.20.1 solc

稳固合同

现在ganache已经安装并运行,我们将开始编写个Ethereum智能契约。

我们将使用solidity编程语言来编写合同。如果你熟悉面向对象编程,学习用实写合同应该很简单。我们会写一个契约叫做投票(可以看作是面向对象编程语言的一个类)。本合同有以下内容:

初始化一些候选对象的构造函数。

一种投票方法(票数加1)

一种返回候选人获得的总票数的方法

当您将合同部署到区块链时,构造函数只被调用一次。与网络世界不同,在网络世界中,每次部署代码时旧代码都会被覆盖,在区块链部署的合同是不可更改的。也就是说,如果您更新合同并再次部署它,旧合同将仍然存在于区块链,数据也将仍然存在。新部署将创建合同的新实例。

务实稳健的^0.4.18;

投票合同{

映射(字节32=uint8)公共votesReceived

bytes32[]公共候选列表;

投票功能(字节32[]候选名称)公共{

candidateList=candidateNames

}

函数TotalVotesFOr(byte 32候选)查看公共返回(uint8) {

要求(有效候选人);

返回VOTesReceived[候选人];

}

函数voteForCandidate(字节32候选)public {

要求(有效候选人);

votesReceived[候选者]=1;

}

函数valid考生(字节32考生)查看公共返回(bool) {

for(uint I=0;i candidateList.lengthi ) {

if(候选列表[i]==候选项){

返回true

}

}

返回false

}

}

复制代码,把右边的代码复制到一个名为Voting.sol的文件中,保存在章目录下。

代码和解释

第1行。我们必须指定将编译代码的编译器版本

第三行。映射相当于关联数组或字典,它是一个键值对。映射votesReceived键是候选项的名称,类型是字节32。映射的值是一个未赋值的整数,用于存储投票数。

第4行。在许多编程语言中,所有的候选名称都只能通过votesReceived.keys来获得。然而,在solidity中没有这样的方法,所以我们必须单独管理一个候选数组candidateList。

14号线。注意votesReceived[key]的默认值是0,不需要初始化为0,加1即可。

您还会注意到,每个函数都有一个可见性说明符(例如本例中的public)。这意味着可以从契约之外调用函数。如果不希望别人调用这个函数,可以设置为私有函数。如果不指定可见性,编译器将引发警告。最近solidity编译器做了一些改进。如果用户忘记标记私有函数,导致对私有函数的外部调用,编译器就会捕捉到这个问题。您可以在这里看到所有的可见性说明符。

您还将看到一些函数的修改器视图。它通常用于告诉编译器该函数是只读的(也就是说,如果调用该函数,区块链状态将不会更新)。所有的修饰语都可以在这里看到。

编译智能合同

我们将使用上一节中安装的solc库来编译代码。如果你记得的话,我们之前提到过web3js是一个允许你通过RPC与区块链交互的库。我们将使用这个库在节点控制台中部署合同,并与区块链进行交互。

首先,在终端运行node进入node控制台,初始化web3对象,查询区块链获取所有账号。

确保ganache同时在另一个窗口中运行

要编译契约,首先从Voting.sol加载代码,并将其绑定到字符串类型的变量,然后按如下方式编译契约。

$ node

在节点控制台中

Web3=require('web3 ')

web 3=new Web3(new Web3 . providers . httprovider(' http://localhost :8545 '));

web3.eth.accounts

['0x5c 252 a 0 c 0475 f 9711 b 56 ab 160 a 1999729 eccce 97 '

0x 353d 310 bed 379 B2 D1 df 3b 727645 e 200997016 ba 3 '

0x3 DDC 09 b5 e 49d 654 a 43 e 161 ca E3 f 865261 CAD 23 '

0xa 8 a 188 c 6d 97 EC 8 cf 905 cc 1 DD CD 318 e 887249 EC 5 '

0xc 0 aa 5 F8 b 79 db 71335 dacc 7 CD 116 f 357d 7 ECD 2798 '

0xda 695959 ff 85 f 0581 ca 924 e 549567390 a 0034058 '

0xd 4ee 63452555 a 87048 dcfe 2 a 039208d 113323790 '

0xc 60 c8 a 7b 752d 38 e 35 e 0359 e 25 a2 E0 f 6692 b 10d 14 '

0xba 7 EC 95286334 e 8634 e 89760 fab 8 D2 EC 1226 BF 42 '

0x 208 e 02303 Fe 29 be 3698732 e 92 ca 32 b 88d 80 a2 d 36 ']

code=fs . readfilesync(' Voting . sol ')。toString()

solc=require('solc ')

compiledCode=solc.compile(code)

复制代码当您成功编译契约并打印compiledCode对象(直接在节点控制台输入compiledCode就可以看到内容)时,您会注意到有两个重要的字段,非常重要,必须了解:

1.编译代码。合同[':投票']。字节码:这是由投票软件公司编译的字节码,也是部署在区块链的代码。

2.编译代码。合同[' :投票']。Interface:这是一个合同的接口或模板(称为abi定义),它告诉用户在这个合同中有哪些可用的方法。无论何时你想在未来与任何合同互动,你都需要这个abi定义。你可以在这里看到更多关于ABI的事情。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航