本书“为以太坊区块链创建Solidity智能合约。 实用指南


一年多的时间里,我编写了《为以太坊区块链创建Solidity智能合约》一书。 实用指南”,现在这项工作已经完成,并且该书已出版并以升显示

我希望我的书能帮助您快速开始为以太坊区块链创建Solidity智能联系人和分布式DApp应用程序。 它包括12堂课,配有实践练习。 完成这些操作后,读者将能够创建自己的本地以太坊节点,发布智能合约并调用其方法,使用oracle在现实世界和智能合约之间交换数据,并与Rinkeby测试调试网络合作。

本书面向所有对区块链领域的先进技术感兴趣并希望快速获得知识的人,这些知识使他们能够从事有趣而有前途的工作。

在下面,您会找到目录和书的第一章(书的片段也可以在Liters上找到 )。 希望得到反馈,评论和建议。 在准备本书的下一版时,我会尝试考虑所有这些因素。

目录
引言
我们的书适合那些不仅要了解以太坊区块链的原理,还想获得以该网络的Solidity编程语言创建分布式DApp应用程序的实践技能的人。

这本书不仅要阅读,而且要与之配合使用,更好地完成课程中描述的实际任务。 要工作,您需要安装了Debian或Ubuntu OS的本地计算机,虚拟服务器或云服务器。 您还可以使用Raspberry Pi完成许多任务。

在第一课中,我们将考虑以太坊区块链的原理和基本术语,并讨论在哪里可以使用该区块链。

第二课的目的是创建一个以太坊私有区块链节点,作为本课程在Ubuntu和Debian服务器上的进一步工作。 我们将考虑安装基本实用程序的功能,例如geth,它可以确保我们的区块链节点以及大量分散式数据仓库守护程序的运行。

第三课将教您如何在便宜的Raspberry Pi微型计算机上进行以太坊实验。 您可以在Raspberry Pi上安装Rasberian操作系统(OS),提供区块链节点操作的Geth实用程序以及Swarm分散式数据仓库守护程序。

第四个课程专门介绍以太坊网络上的帐户和加密货币单位,以及如何从Geth控制台将资金从一个帐户转移到另一个帐户。 您将学习如何创建帐户,启动汇款交易,接收交易状态及其收据。

在第五课中,您将了解以太坊网络上的智能合约,了解以太坊虚拟机如何实现它们。

您将在以太坊专用网络中创建并发布您的第一个智能合约,并学习如何调用其功能。 您将为此使用Remix Solidity IDE开发环境。 此外,您还将学习如何安装和使用solc批处理编译器。
我们还将讨论所谓的应用程序二进制接口(ABI)二进制接口,并教授如何使用它。

第六课专门介绍如何在Node.js下运行并使用智能合约Solidity执行操作的JavaScript脚本。

您在Ubuntu,Debian和Rasberian OS上安装Node.js,编写用于在以太坊本地网络上发布智能合约并调用其功能的脚本。

此外,您还将学习如何使用脚本在常规帐户之间转移资金,以及如何将其转移到智能合约帐户。

在第七课中,您将学习如何安装和使用Truffle集成环境,该环境在Solidity智能合约开发人员中很流行。 您将学习如何创建使用truffle-contract模块调用合同功能的JavaScript脚本,以及如何使用Truffle测试智能合同。

第八课涉及Solidity数据类型。 您将编写适用于数据类型的智能合约,例如有符号和无符号整数,有符号数字,字符串,地址,复杂类型变量,数组,枚举,结构和字典。

在第九课中,您将更进一步,为以太坊核心网络创建智能合约。 您将学习如何在Geth专用网络以及Rinkeby测试网络上使用Truffle发布合同。 在Rinkeby网络上调试智能合约非常有用,然后再在主网络上发布它-几乎所有东西都是真实的,但是免费的。

在本课程中,您将创建一个Rinkeby测试网络节点,为其补充资金,并发布智能合约。

第10课重点介绍以太坊Swarm分布式数据仓库。 使用分布式存储,您可以节省在以太坊区块链上存储大量数据的麻烦。

在本课程中,您将创建本地Swarm存储,执行写入和读取文件以及包含文件的目录的操作。 接下来,您将学习如何使用Swarm公共网关,编写脚本以从Node.js访问Swarm以及使用Perl Net :: Ethereum :: Swarm模块。

第11课的目的是使用流行的Python编程语言和Web3.py框架掌握Solidity智能合约。 您将安装此框架,编写脚本来编译和发布智能合约,以及调用其功能。 同时,Web3.py可以单独使用,也可以与Truffle集成开发环境结合使用。

在第12课中,您将学习如何使用Oracle在智能合约和现实世界之间传输数据。 这对于您从网站,IoT物联网设备,各种设备和传感器接收数据以及将数据从智能合约发送到这些设备很有用。 在本课程的实践部分中,您将创建一个预兆和一个智能合约,该合约从俄罗斯联邦中央银行的网站接收美元对卢布的当前汇率。

课程1.简要介绍以太坊区块链和网络
本课程的目的:熟悉以太坊区块链的原理,其应用领域和基本术语。
练习题:本课未提供。

今天几乎没有软件开发人员对区块链技术,加密货币(Cryptocurrency或Crypto Currency),比特币(Bitcoin),初始代币发行(ICO,初始代币发行),智能合约一无所知。 (智能合约)以及与区块链相关的其他概念和术语。

区块链技术开拓了新市场,并为程序员创造了就业机会。 如果您了解加密货币技术和智能合约技术的所有复杂性,那么在实践中应用此知识就不会有问题。

我必须说,围绕加密货币和区块链的猜测很多。 我们将搁置关于加密货币汇率变化,金字塔的创建,关于加密货币立法的复杂性等问题的讨论。 在我们的培训课程中,我们将主要侧重于以太坊区块链智能合约(以太坊,以太坊)应用的技术方面以及所谓的分布式应用程序(DApp)的开发。

什么是区块链?


区块链(Blockchain,Block Chain)是以特定方式连接的数据块链。 链的开头是第一个块,称为创世块或创世块。 其次是第二个,然后是第三个,依此类推。

所有这些数据块都会在区块链网络的众多节点上自动复制。 这确保了区块链数据的分散存储。
您可以将区块链系统想象为大量节点(物理或虚拟服务器),它们相互联网并复制数据块链中的所有更改。 这就像一台巨大的多服务器计算机,并且这样一台计算机(服务器)的节点可以分散在世界各地。 您也可以将您的计算机添加到区块链网络中。

分布式数据库


区块链可以想象成复制到区块链网络所有节点的分布式数据库。 从理论上讲,只要至少一个存储区块链所有块的节点在运行,区块链就可以运行。

分布式数据注册表


区块链可以想象为数据和操作(交易)的分布式注册表。 这种注册表的另一个名称是分类帐。

您可以将数据添加到分布式注册表中,但是不能更改或删除它。 尤其是通过使用加密算法,用于向链中添加块的特殊算法以及分散的数据存储来实现这种可能性。

在添加块并执行操作(事务)时,将使用私钥和公钥。 他们通过仅允许他们访问其数据块来限制区块链用户。

交易次数


区块链将有关操作(交易)的信息存储在块中。 同时,已经完成的旧事务无法回滚或更改。 新事务存储在新添加的块中。

因此,整个交易历史可以在区块链中保持不变。 因此,区块链可以用于例如安全地存储银行业务,版权信息,房地产所有权的变化历史等。

以太坊区块链包含所谓的系统状态。 随着事务完成,状态从初始更改为当前。 事务以块形式编写。

公共和私有区块链


应该注意的是,上述所有情况仅适用于所谓的公共区块链网络,该网络不能由任何个人或法人,国家机构或政府控制。
所谓的私有区块链网络在其创建者的完全控制下,在那里一切皆有可能,例如,完全替换链中的所有区块。

区块链实际应用


区块链能做什么呢?

简而言之,区块链使您能够在彼此不信任的人或公司之间安全地进行交易(交易)。 记录后不能伪造或替换记录在区块链中的数据(交易,个人数据,文档,证书,合同,发票等)。 因此,您可以在区块链的基础上创建各种文档的可信分布式注册表。

当然,您知道加密货币系统是基于区块链创建的,旨在取代普通纸币。 纸币也称为法定货币(来自Fiat Money)。
区块链提供区块中记录的交易的存储和不变性,因此它也可以用于创建加密货币系统。 它包含了不同用户(帐户)之间加密货币资金转移的全部历史记录,并且可以跟踪任何操作。

尽管加密货币系统内的交易可能是匿名的,但提取加密货币并将其兑换成法定货币通常会导致披露加密货币资产所有者的身份。

所谓的智能合约,是在以太坊网络上运行的软件,可以自动完成交易并控制其执行过程。 如果使用以太币加密货币进行交易付款,这将特别有效。

以编程语言Solidity编写的以太坊区块链和以太坊智能合约可用于例如以下领域:

  • 代替公证的文件;
  • 存放房地产登记册和与房地产交易的信息;
  • 存储有关知识产权的版权信息(书籍,图像,音乐等);
  • 建立独立的投票系统;
  • 金融和银行业;
  • 国际物流,跟踪货物流动;
  • 个人数据的存储,类似于身份证系统;
  • 确保商业领域的交易;
  • 存储体检结果以及规定程序的历史

区块链问题


但是,当然,并非所有事情看起来都那么简单!

在将数据添加到区块链之前验证数据存在问题(例如,它们是否是伪造的?),用于区块链的系统和应用软件的安全性问题,使用社会工程方法窃取对加密货币钱包的访问权限等问题。 .p。

同样,如果这不是关于其节点分散在世界各地的公共区块链,而是关于一个人或组织拥有的私有区块链,那么这里的信任度将不会高于此人或这个组织的信任度。

还应该记住,区块链上记录的数据对所有人都可用。 从这个意义上讲,区块链(尤其是公共区块链)不适合存储机密信息。 但是,无法更改区块链上的信息这一事实可以帮助防止或调查各种欺诈活动。

如果您为使用加密货币付费,则去中心化的以太坊应用程序将很方便。 拥有加密货币或准备购买加密货币的人越多,将获得越来越流行的DApp应用程序和智能合约。

在阻碍区块链实际应用的常见问题中,可以提到添加新区块的速度有限以及交易成本相对较高。 但是该领域的技术正在积极发展,并希望随着时间的流逝解决技术问题。

另一个问题是,以太坊区块链智能合约在隔离的虚拟机环境中工作,无法访问真实世界的数据。 特别是,智能合约程序无法从站点或任何物理设备(传感器,联系人等)本身读取数据,也无法将数据输出到任何外部设备。 在专门针对所谓的Oracle(智能合约的信息中介)的课程中,我们将讨论此问题及其解决方法。

还有法律限制。 例如,在某些国家/地区,禁止使用加密货币作为付款方式,但您可以将其作为一种数字资产(如证券)来拥有。 这些资产可以在证券交易所买卖。 无论如何,在创建使用加密货币的项目时,您需要熟悉项目所属国家的法律。

区块链链如何形成


正如我们已经说过的,区块链是一条简单的数据块链。 首先,形成此链的第一个块,然后向其添加第二个块,依此类推。 假定事务数据存储在块中,并添加到最后一个块中。

在图。 1.1我们展示了一系列块的最简单版本,其中第一个块是下一个块。


1.1。 简单的块顺序

然而,在该实施例中,很容易伪造链中任何块的内容,因为这些块不包含任何防止更改的信息。 鉴于区块链旨在供不信任的人员和公司使用,我们可以得出结论,这种为区块链存储数据的方法不适合。

让我们保护块免受伪造。 在第一阶段,我们将尝试通过校验和保护每个块(图1.2)。


1.2。 添加带有校验和的数据块保护

现在,攻击者不能只更改一个块,因为它包含块数据的校验和。 检查校验和将显示数据已更改。

要计算校验和,可以使用哈希函数之一,例如MD-5,SHA-1,SHA-256等。 由于对数据块执行不可逆的操作,哈希函数计算出某个值(例如,作为恒定长度的文本字符串)。 操作取决于哈希函数的类型。

即使数据块的内容有很小的变化,哈希函数的值也将发生变化。 通过分析哈希函数的值,不可能还原为其计算了该数据块的数据块。

这样的保护是否足够? 不幸的是,没有。

在此方案中,校验和(哈希函数)仅保护单个块,而不保护整个块链。 知道哈希函数计算算法后,攻击者可以轻松地替换块的内容。 同样,没有什么可以阻止他从链中删除块或添加新块。

为了从整体上保护整个链,可以将每个块中前一个块的数据散列与数据一起存储(图1.3)。


1.3。 将前一个块的哈希添加到数据块

在此方案中,要更改块,您需要重新计算所有后续块的哈希函数。 看来是什么问题?

在实际的区块链中,还会增加额外的人为困难,以增加新的区块-使用需要大量计算资源的算法。 鉴于要更改一个块,不仅需要计算一个块,而且还需要计算所有后续块,所以这样做非常困难。

还记得区块链数据存储(复制)在许多网络节点上,即使用分散存储。这极大地增加了假块的复杂度,因为 必须对网络的所有节点进行更改。

由于这些块存储有关前一个块的信息,因此您可以检查链中所有块的内容。

以太坊区块链


Ethereum , DApp. , Ethereum (-, smart contracts), Solidity.

2013 , Bitcoin Magazine, 2015 . , , Ethereum - Solidity.


(mining) , « ». , .. Ethereum.

, , (miner).
(), , Nonce, -, . Ethash, Ethereum, Nonce .

Nonce, (PoW, Proof-of-work). , Ethereum, — Ether. 5 Ether, .

, Ethereum , , . , Solidity DApp Ethereum.


, . , , .

. — ( ), . , Ethereum - Solidity. , , ..

, . , , , , - , , .

. . , , .

2. Ubuntu Debian


Geth Swarm Ubuntu
Geth Swarm Debian

Go

Go
Geth Swarm

genesis.json






Geth


3. Raspberry Pi 3
Raspberry Pi 3
Rasberian

SSH
IP

Go
Go

Go
Geth Swarm




4.



geth account

Ethereum
Ethereum


eth.sendTransaction




5.
- Ethereum
-
Ethereum
Remix Solidity IDE



ABI



solc
solc Ubuntu
solc Debian
HelloSol

solc Rasberian


6. - Node.js
Node.js
Ubuntu
Debian
Ganache-cli
Web3
solc
Node.js Rasberian

-




ABI



-
-
Web3 1.0.x





- HelloSol

getBalance call_contract_get_promise.js
-


7. Truffle
Truffle
HelloSol

contracts
migrations
test
truffle-config.js
HelloSol

HelloSol Truffle
HelloSol JavaScript Node.js
truffle-contract
getValue getString
setValue setString

Web3 1.0.x
- HelloSol

Truffle
Solidity
JavaScript


8. Solidity




地址





mapping


9. Rinkeby
Truffle Geth


Truffle
geth
Truffle
Truffle Rinkeby
Geth Rinkeby


Rinkeby
Rinkeby
Rinkeby
Truffle Rinkeby

Node.js
Truffle Rinkby


10. Ethereum Swarm
Ethereum Swarm
Swarm

Ethereum Swarm
Ethereum Swarm



Swarm
Swarm Node.js
Perl Net::Ethereum::Swarm
Net::Ethereum::Swarm



11. Web3.py Ethereum Python
Web3.py

easysolc
Web3.py



abi


abi JSON



Truffle Web3.py


12.
-




USDRateOracle
-
Web Socket
RateUpdate
RateUpdate
-




更正和补充



如果在与更新与以太坊相关的软件版本相关的书上工作时遇到错误或问题,请给我写信。我将尝试在此处找到并发布解决方案。

致命:无法写入创世纪块:不支持的派生顺序:未启用eip150Block,但将eip155Block设置为0
将eip150Block参数添加到genesis.json文件中:
{
"config": {
"chainId": 1999,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "10",
"gasLimit": "5100000",
"alloc": {}
}

Source: https://habr.com/ru/post/zh-CN467347/


All Articles