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

《为以太坊区块链创建 Solidity 智能合约》一书。 实用指南》
一年多来,我一直在写《为以太坊区块链创建 Solidity 智能合约》一书。 实用指南”,现在这部作品已经完成了,这本书 已发布并以升为单位提供.

我希望我的书能帮助您快速开始为以太坊区块链创建 Solidity 智能合约和分布式 DApp。 它由 12 节带有实际任务的课程组成。 完成这些任务后,读者将能够创建自己的本地以太坊节点,发布智能合约并调用其方法,使用预言机在现实世界和智能合约之间交换数据,并使用 Rinkeby 测试调试网络。

本书面向所有对区块链领域的先进技术感兴趣并希望快速获得知识以从事有趣和有前途的工作的人。

下面您将找到本书的目录和第一章(也包括 文学 本书的片段可用)。 我希望收到反馈、意见和建议。 在准备本书的下一版本时,我将尽力考虑到所有这些。

目录介绍我们的书面向那些不仅想要了解以太坊区块链原理,还想要获得使用 Solidity 编程语言为该网络创建分布式 DApp 的实用技能的人。

最好不仅阅读这本书,还应该使用它,执行课程中描述的实际任务。 要工作,您需要一台安装了 Debian 或 Ubuntu 操作系统的本地计算机、虚拟服务器或云服务器。 您还可以使用 Raspberry Pi 执行许多任务。

第一节课时 我们将了解以太坊区块链的操作原理和基本术语,并讨论该区块链可以在哪里使用。

目标 第二课 — 创建一个私有以太坊区块链节点,以便在 Ubuntu 和 Debian 服务器上进行本课程的进一步工作。 我们将了解安装基本实用程序的功能,例如确保区块链节点运行的 geth,以及 swarm 去中心化数据存储守护进程。

第三课 将教您如何在廉价的 Raspberry Pi 微型计算机上试验以太坊。 您将在 Raspberry Pi 上安装 Rasberian 操作系统 (OS)、为区块链节点提供支持的 Geth 实用程序以及 Swarm 去中心化数据存储守护进程。

第四课 致力于以太坊网络上的账户和加密货币单位,以及从 Geth 控制台将资金从一个账户转移到另一个账户的方法。 您将学习如何创建账户、发起资金转账交易以及获取交易状态和收据。

在第五课中 您将熟悉以太坊网络上的智能合约,并了解它们在以太坊虚拟机上的执行情况。

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

第六课 致力于创建运行 Node.js 的 JavaScript 脚本并使用 Solidity 智能合约执行操作。

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

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

在第七课中 您将学习如何安装和使用在 Solidity 智能合约开发人员中流行的 Truffle 框架。 您将学习如何使用 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课时 您将学习使用预言机在智能合约和现实世界之间传输数据。 这对于您从网站、物联网设备、各种设备和传感器接收数据以及将数据从智能合约发送到这些设备非常有用。 在本课程的实践部分,您将创建一个预言机和一个智能合约,用于从俄罗斯联邦中央银行网站接收美元和卢布之间的当前汇率。

第 1 课. 简要介绍区块链和以太坊网络上课目的: 熟悉以太坊区块链的运行原理、应用领域和基本术语。
实际任务: 本课未涉及。

如今几乎没有一个软件开发人员没有听说过区块链技术(Blockchain)、加密货币(Cryptocurrency或Cryptocurrency)、比特币(Bitcoin)、首次代币发行(ICO,Initial coin发行)、智能合约(Smart Contract)、以及与区块链相关的其他概念和术语。

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

必须说,围绕加密货币和区块链有很多猜测。 我们将把有关加密货币汇率变化、金字塔的创建、加密货币立法的复杂性等问题的讨论放在一边。 在我们的培训课程中,我们将主要关注以太坊区块链(Ethereum,Ether)智能合约应用的技术方面以及所谓的去中心化应用程序(Distributed Application,DApp)的开发。

什么是区块链?

区块链(Block Chain)是按一定方式相互连接的数据块链。 在链的开头有第一个块,称为主块(创世块)或创世块。 接下来是第二个,然后是第三个,依此类推。

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

分布式数据库

区块链可以被认为是在区块链网络的所有节点上复制的分布式数据库。 理论上,只要至少一个节点在工作并存储区块链的所有区块,区块链就可以运行。

分布式数据注册

区块链可以被认为是数据和操作(交易)的分布式账本。 这种登记册的另一个名称是分类帐。

数据可以添加到分布式账本中,但不能更改或删除。 这种不可能是通过使用密码算法、向链添加区块的特殊算法和去中心化数据存储来实现的。

添加区块和执行操作(交易)时,会使用私钥和公钥。 他们通过只允许区块链用户访问自己的数据块来限制他们。

交易

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

这样,整个交易历史就可以原封不动地记录在区块链上。 因此,区块链可以用来安全地存储银行交易、版权信息、业主变更历史等。

以太坊区块链包含所谓的系统状态。 随着事务的执行,状态从初始状态变为当前状态。 交易记录在区块中。

公共和私有区块链

这里应该指出的是,上述一切仅适用于所谓的公共区块链网络,它不能被任何个人或法人实体、政府机构或政府控制。
所谓的私有区块链网络处于其创建者的完全控制之下,一切皆有可能,例如完全替换链上的所有区块。

区块链的实际应用

区块链可以用来做什么?

简而言之,区块链可以让你在互不信任的人或公司之间安全地进行交易(交易)。 区块链中记录的数据(交易、个人数据、文件、证书、合同、发票等)记录后无法篡改或替换。 因此,基于区块链,可以创建各种文档的可信分布式注册表等。

当然,您知道加密货币系统是在区块链的基础上创建的,旨在取代普通纸币。 纸币也称为法定货币(来自 Fiat Money)。
区块链确保区块中记录的交易的存储和不变性,这就是它可以用来创建加密货币系统的原因。 它包含了不同用户(账户)之间加密资金转移的整个历史记录,任何操作都可以被追踪。

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

所谓的智能合约是在以太坊网络上运行的软件,允许您自动完成交易并监控其实施的过程。 如果使用以太加密货币进行交易支付,这尤其有效。

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

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

区块链的问题

但是,当然,并非一切都像看起来那么简单!

在将数据添加到区块链之前验证数据存在问题(例如,它们是假的吗?)、用于与区块链一起工作的系统和应用软件的安全性问题、使用社会工程方法窃取访问权限的可能性问题到加密货币钱包等。

再说一次,如果我们谈论的不是节点分散在世界各地的公共区块链,而是属于个人或组织的私有区块链,那么这里的信任级别不会高于信任级别在这个人或这个组织中。

还应该考虑到区块链中记录的数据可供所有人使用。 从这个意义上说,区块链(尤其是公共的)不适合存储机密信息。 然而,区块链上的信息无法更改这一事实可以帮助预防或调查各种类型的欺诈活动。

如果您使用加密货币支付以太坊去中心化应用程序的使用费用,将会很方便。 拥有加密货币或愿意购买加密货币的人越多,DApp 和智能合约就会越受欢迎。

区块链阻碍其实际应用的常见问题包括添加新区块的速度有限以及交易成本相对较高。 但这一领域的技术正在积极发展,技术问题有望随着时间的推移得到解决。

另一个问题是以太坊区块链上的智能合约在虚拟机的隔离环境中运行,无法访问现实世界的数据。 特别是,智能合约程序本身无法从站点或任何物理设备(传感器、触点等)读取数据,也无法将数据输出到任何外部设备。 我们将在专门讨论所谓的预言机(智能合约的信息中介)的课程中讨论这个问题以及解决它的方法。

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

区块链链是如何形成的

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

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

《为以太坊区块链创建 Solidity 智能合约》一书。 实用指南》
米。 1.1. 简单的块序列

然而,使用此选项,很容易篡改链中任何块的内容,因为这些块不包含任何防止更改的信息。 考虑到区块链的目的是供彼此之间没有信任的个人和公司使用,我们可以得出结论,这种存储数据的方法不适合区块链。

让我们开始保护积木免遭伪造。 在第一阶段,我们将尝试使用校验和来保护每个块(图1.2)。

《为以太坊区块链创建 Solidity 智能合约》一书。 实用指南》
米。 1.2. 通过校验和为这些块添加保护

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

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

即使数据块的内容发生微小变化,哈希值也会发生变化。 通过分析哈希函数值,不可能重建其计算的数据块。

这样的保护足够吗? 很不幸的是,不行。

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

为了保护整个链,您还可以在每个块中与数据一起存储前一个块的数据的哈希值(图 1.3)。

《为以太坊区块链创建 Solidity 智能合约》一书。 实用指南》
米。 1.3. 将前一个块的哈希值添加到数据块中

在这个方案中,为了改变一个区块,需要重新计算所有后续区块的哈希函数。 如此看来,问题出在哪里呢?

在真实的区块链中,添加新区块会额外产生人为的困难——使用需要大量计算资源的算法。 考虑到为了对一个块进行更改,您不仅需要重新计算这个块,还需要重新计算所有后续块,这将是非常困难的。

我们还请记住,区块链数据存储(重复)在许多网络节点上,即使用分散存储。 这使得伪造区块变得更加困难,因为必须对所有网络节点进行更改。

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

以太坊区块链

以太坊区块链是一个可以创建分布式 DApp 的平台。 与其他平台不同,以太坊允许使用所谓的智能合约(智能合约),以 Solidity 编程语言编写。

该平台由比特币杂志创始人 Vitalik Buterin 于 2013 年创建,并于 2015 年推出。 我们在培训课程中学习或做的所有事情都与以太坊区块链和 Solidity 智能合约特别相关。

挖矿或如何创建区块

挖矿是一个相当复杂且资源密集型的过程,将新的区块添加到区块链中,而不是“加密货币挖矿”。 挖矿确保了区块链的功能,因为正是这个过程负责将交易添加到以太坊区块链。

参与添加区块的人和组织称为矿工。
矿工节点上运行的软件尝试为最后一个块找到一个名为Nonce的哈希参数,以获得网络指定的特定哈希值。 以太坊中使用的Ethash哈希算法允许您仅通过顺序搜索即可获得Nonce值。

如果矿工节点找到了正确的Nonce值,那么这就是所谓的工作量证明(PoW,Proof-of-work)。 在这种情况下,如果向以太坊网络添加一个区块,矿工就会收到一定的网络货币奖励——以太币。 在撰写本文时,奖励为 5 以太币,但随着时间的推移,奖励会减少。

因此,以太坊矿工通过添加区块来确保网络的运行,并为此获得加密货币资金。 互联网上有很多关于矿工和挖矿的信息,但我们将专注于在以太坊网络上创建 Solidity 合约和 DApp。

课程总结

在第一课中,您熟悉了区块链,并了解到它是一种特殊组成的区块序列。 先前记录的区块的内容无法更改,因为这需要在许多网络节点上重新计算所有后续区块,这需要大量的资源和时间。

区块链可用于存储交易结果。 其主要目的是组织之间不存在信任的各方(个人和组织)之间的安全交易。 您了解了哪些特定业务领域以及哪些领域可以使用以太坊区块链和 Solidity 智能合约。 这是银行部门,产权登记,文件等等。

您还了解到使用区块链时可能会出现各种问题。 这些问题包括验证添加到区块链的信息、区块链的速度、交易成本、智能合约与现实世界之间的数据交换问题,以及攻击者旨在从用户账户窃取加密货币资金的潜在攻击。 。

我们还简要讨论了挖矿作为向区块链添加新区块的过程。 挖矿是完成交易所必需的。 参与挖矿的人确保区块链的运行,并因此获得加密货币奖励。

第 2 课. 在 Ubuntu 和 Debian 操作系统中准备工作环境选择操作系统
安装必要的实用程序
在 Ubuntu 上安装 Geth 和 Swarm
在 Debian 上安装 Geth 和 Swarm
初步准备
下载 Go 发行版
设置环境变量
检查Go版本
安装 Geth 和 Swarm
创建私有区块链
准备 genesis.json 文件
创建工作目录
创建一个帐户
开始节点初始化
节点启动选项
连接到我们的节点
采矿管理和平衡检查
关闭 Geth 控制台
课程总结

第3课. 准备Raspberry Pi 3上的工作环境准备 Raspberry Pi 3 进行工作
安装拉斯伯里安
在安装更新
启用 SSH 访问
设置静态IP地址
安装必要的实用程序
安装Go
下载 Go 发行版
设置环境变量
检查Go版本
安装 Geth 和 Swarm
创建私有区块链
检查您的帐户和余额
课程总结

第 4 课. 账户和账户之间的资金转移查看和添加帐户
查看帐户列表
添加帐户
geth 帐户命令选项
账户密码
以太坊中的加密货币
以太坊货币单位
我们确定账户的当前余额
将资金从一个账户转移到另一个账户
eth.sendTransaction方法
查看交易状态
交易收据
课程总结

第 5 课. 发布您的第一份合同以太坊中的智能合约
智能合约执行
以太坊虚拟机
集成开发环境 Remix Solidity IDE
运行编译
调用合约函数
在专用网络上发布合约
我们得到ABI定义和合约二进制代码
合同的公布
检查合约发布交易状态
调用合约函数
批量编译solc
在 Ubuntu 上安装 solc
在 Debian 上安装 solc
编译HelloSol合约
合同的公布
在 Rasberian 上安装 solc
课程总结

第 6 课:智能合约和 Node.js安装 Node.js
在 Ubuntu 上安装
在 Debian 上安装
安装并运行 Ganache-cli
Web3安装
安装solc
在 Rasberian 上安装 Node.js
用于在控制台中获取帐户列表的脚本
用于发布智能合约的脚本
启动并获取参数
获取启动选项
合同编制
解锁您的帐户
加载ABI和合约二进制代码
估计所需的气体量
创建对象并开始发布合约
运行合约发布脚本
调用智能合约函数
是否可以更新已发布的智能合约?
使用 Web3 版本 1.0.x
获取账户列表
合同的公布
调用合约函数
将资金从一个账户转移到另一个账户
转账至合约账户
更新HelloSol智能合约
创建脚本来查看您的帐户余额
将对 getBalance 函数的调用添加到 call_contract_get_promise.js 脚本中
我们给智能合约账户充值
课程总结

课 7. 松露简介安装松露
创建HelloSol项目
创建项目目录和文件
合同目录
目录迁移
目录测试
truffle-config.js 文件
编译HelloSol合约
开始发布合同
在 Truffle 提示符下调用 HelloSol 合约函数
从运行 Node.js 的 JavaScript 脚本调用 HelloSol 合约函数
安装 truffle-contract 模块
调用合约函数 getValue 和 getString
调用合约函数setValue和setString
合同修改及重新公布
使用 Web3 版本 1.0.x
更改 HelloSol 智能合约
调用合约方法的脚本
在松露中测试
坚固性测试
JavaScript 测试
课程总结

第 8 课:Solidity 数据类型学习数据类型的契约
布尔数据类型
无符号整数和有符号整数
定点数
地址
复杂类型的变量
固定大小的数组
动态数组
清单
结构
字典映射
课程总结

第 9 课. 将合约迁移到专用网络和 Rinkeby 网络将合约从 Truffle 发布到私有 Geth 网络
准备私有网络节点
准备工作合同
编译合约并将其迁移到 Truffle 网络
启动本地网络迁移 geth
获取松露文物
将 Truffle 合约发布到 Rinkeby 测试网
准备 Geth 节点以与 Rinkeby 一起使用
节点同步
添加账户
用以太币充值您的 Rinkeby 账户
启动合约迁移至 Rinkeby 网络
查看 Rinkeby 网络上的合约信息
Rinkeby 网络的 Truffle 控制台
调用合约函数的更简单方法
使用 Node.js 调用合约方法
在 Rinkby 的 Truffle 控制台中的账户之间转移资金
课程总结

第 10 课:以太坊 Swarm 去中心化数据存储以太坊群是如何工作的?
安装并启动 Swarm
文件和目录的操作
将文件上传到以太坊 Swarm
从以太坊 Swarm 读取文件
查看上传文件的清单
加载带有子目录的目录
从下载的目录中读取文件
使用公共 Swarm 网关
从 Node.js 脚本访问 Swarm
Perl Net::以太坊::Swarm 模块
安装 Net::Ethereum::Swarm 模块
写入和读取数据
课程总结

第 11 课:在 Python 中使用以太坊的 Web3.py 框架安装Web3.py
更新并安装必要的软件包
安装easysolc模块
使用 Web3.py 发布合约
合同编制
连接到提供商
执行合同发布
将合约地址和abi保存在文件中
运行合约发布脚本
调用合约方法
从 JSON 文件中读取合约的地址和 abi
连接到提供商
创建合约对象
调用合约方法
Truffle 和 Web3.py
课程总结

课 12. 神谕智能合约可以信任来自外界的数据吗?
预言机作为区块链信息中介
数据源
表示源数据的代码
Oracle 用于在区块链中记录汇率
美元汇率甲骨文合约
更新智能合约中的汇率
使用 Web Socket 提供程序
等待 RateUpdate 事件
处理 RateUpdate 事件
在智能合约中启动数据更新
课程总结

来源: habr.com

添加评论