主页 > imtoken钱包最新下载 > 以太坊区块链技术发展详解

以太坊区块链技术发展详解

imtoken钱包最新下载 2023-04-17 07:46:49

以太坊Ethereum区块链技术开发讲解

“以太坊(Ethereum)”是一个基于区块链的去中心化应用平台,它将比特币的基础设施——基于密码学的区块链技术构建成一个通用平台,并补充了比特币网络的一些缺失特性,使开发者可以在其上运行自己的去中心化应用。区块链。

在详细介绍以太坊之前,让我介绍一下(在我看来)去中心化网络的两个基础——密码学和游戏。 不用说,密码学无非是通过公钥加密、数字签名、散列和摘要算法在数学上确保安全; 而博弈意味着在一个去中心化的网络中,任何人,包括恶意希望攻击这个网络的任何人都可能参与。 在设计去中心化网络时,需要从每个参与者的角度考虑每个参与者的利益,确保在遵守规则时利益最大化,在违反规则时产生损失或风险。

然而,在数字世界中,发布一份数据是没有成本的,也没有“得”或“失”。 因此,必须与物理世界建立一定的联系,才能定义“利益”。 例如,在Bitocin网络中,如果攻击者想要人为改变区块链的方向,他需要拥有比其他所有矿工更高的算力。 在现实世界中,计算能力需要由计算设备提供,而计算设备是需要从物理世界购买的——有时即使有钱也没有足够的能力,所以参与比特币的矿工越多网络,抵抗攻击的能力越强。

因此,在去中心化网络中,并不是所有的问题都可以靠“技术”来解决。 技术无法达到的部分,必须通过利益和经济激励来解决。 也是因为“经济激励”的需要,以太坊也有钱包系统(货币单位叫做“以太(Ether)”),每个用户都有一个钱包地址作为自己的唯一标识,这点和Bitcion类似看待。

“合约”是以太坊引入的最重要的概念。 在比特币中,所有地址都属于一个用户——当我们说“用户”时,我们指的是一对公钥和私钥。 但在以太坊中,除了密钥对拥有的地址外,还有一个“代码”拥有的地址,即Contract。 合约由用户发布,其本质是一段代码,发布后不可修改。 合约也像普通账户一样有一个钱包地址。 每当这个地址收到一笔交易时,相关的代码就会被执行。 这些代码:

首先,我们举一个“多人共享钱包”的例子。 在以太坊的官方客户端中,有创建多人钱包的功能:

以太坊Ethereum区块链技术开发讲解

创建多个钱包

如图所示,通过该功能,可以创建一个属于另外两人共同拥有的钱包地址。 每个人每天最多可以使用 100 Ether。 如果超过此限制,则必须有其他人同意。

这个函数实际上会创建一个Contract,上面的逻辑在Contract中用代码来描述。 当你想从这个共享钱包里花钱的时候,你需要给这个共享钱包发送消息(交易是消息,交易金额可以为零,只携带数据),然后共享钱包里的代码就会被执行。 如果请求符合上述逻辑,则发起真实消费交易,否则消费请求将被拒绝(没有真实消费)。

另一个例子是“对冲合约”。 人们一直抱怨比特币作为一种数字货币,其货币价值(以及与法定货币的汇率)不稳定。 套期保值合约可以在一定程度上解决这个问题。

我们把希望保持货币价值不变的人称为“风险规避者”,而另一个愿意承担货币波动风险并从中获利的人称为“风险接受者”,因此他们可以约定一个金额(例如1000元)和一个时间窗口(例如一个月),然后创建一个Contract来执行以下逻辑:

如果 Ether 的价值上涨,风险承担者将获利,如果以太币的价值下跌,风险承担者将亏损,但风险规避者将始终既不亏损也不盈利。 当然,风险规避者和风险承担者可以事先约定风险规避者需要支付的“保费”,也可以约定风险承担者需要提供大于1000元数倍的担保(越高倍数,可承担的风险越大)。

在上面的例子中区块链技术来源于以太坊,其实有一个问题不好解决,就是如何确定以太币和法定货币之间的汇率。 前面我们提到,合约只能访问区块链上的数据,而法定货币是存在于物理世界而不是密码世界的数据,我们需要将这种“来自非密码世界的数据”引入到区块链通过某种机制。

我们可以设计另一个合约来指定这样的逻辑,在每个时间窗口(比如一个小时)从现实世界中收集以太币和法币之间的汇率:

对于任何一个参与者来说,因为不知道其他人的出价,提交真实的汇率更有可能获得奖励,提交离谱的汇率则有很大概率输掉保证金。

当然,这条规则有几个漏洞。 例如,如果一个人有非常大的保证金,那么他可以在获得奖励的同时将平均价格拉到高于或低于实际汇率的价格,并让其他一些提供准确汇率的人失去保证金。 但实际上,在物理世界中也是一样的。 如果你有很多钱区块链技术来源于以太坊,你也可以提高或降低一种商品的价格,但与物理世界相比,电子货币的体量仍然很小,不需要太多,你可以用更多的钱来做; 但实际上,恶意抬高或打压汇率存在着非常大的风险,因为你不确定自己是否已经支付了足够的保证金,如果失败,你将损失所有保证金。

另一个漏洞是“每个人都可以向合约支付保证金并提供汇率”。 这一步是通过创建交易来实现的,所有的交易都会写在区块链上,所以你提交的汇率实际上是别人可见的,这进一步为恶意攻击者创造了可乘之机。 下面我将通过一个“生成随机数”的例子来介绍如何避免这个问题。

前面我们提到合约可以读取区块链上的数据,但是区块链上的数据是确定性的。 如果我们要实现一个类似赌博的应用,应该从哪里获取随机数呢?

一个可以想象的随机数来源是下一个区块的哈希,在大多数情况下,这种随机性水平就足够了。 但事实上,矿工可以在一定程度上操纵这个随机数。 假设一个矿工参与了某种博弈,博弈的收益大于挖出一个区块的收益,那么如果矿工挖出一个区块,就会输掉赌块,那么显然矿工会选择不公布这个新区块,当单个矿工的算力越强时,这一点就越明显。

因此,我们需要引入一种类似于收集汇率的机制来收集随机数种子,然后在每个时间窗口结束时使用这些种子计算一个随机数。 但是就像征求汇率一样,因为参与者通过创建交易来提交汇率,所以每个人提交的随机数在一个时间窗口内对其他人是可见的,所以一个参与了某个赌博的人可以谨慎地挑选一个随机数种子这样别人提交的种子加上新的种子产生的随机数正好符合他的预期。

因此,我们有必要将收集种子的窗口分成两部分,得到一个无人能预测和干预的随机数:

第一阶段,你只知道别人提交的种子的哈希值,而不知道真正的种子,所以你不能精心构造一个种子来干扰结果; 第二阶段,大家只是确认第一阶段提交的种子,不能提交新的,也不能阻止别人提交种子。

前面我们提到,Bitcoin Script 不提供循环、递归和跳转等能力。 或许比特币是出于控制一段Bitcoin Script执行时间的考虑,因为根据图灵的“Halting Theorem”,图灵完全用编程语言编写的程序不能总是从静态分析的角度来判断它是否会在有限的时间后结束步数,因此恶意攻击者可以构造一个会导致死循环的交易来干扰矿工的正常工作。

以太坊通过“经济激励”再次绕过了这个问题。 合约以操作码(operation code)的形式运行在一个叫做EVM(Ethereum Virtual Machine)的虚拟机上。 EVM 是一个虚拟机,有自己的“计费”。 在 EVM 标准中,每个操作码消耗的 Gas 是根据操作所需的内存和 CPU 时间来定义的,这是以太购买的计算资源。 前面提到,当交易的目标是一个Contract时,Contract的代码会被执行,交易的发起方需要支付Contract执行过程中消耗的Gas,同时声明一个“愿意支付的最大天然气量”。 执行到一半,合约将停止执行。

那我们再讨论一下“共识区间”的问题。 前面提到,比特币每10分钟就会出现一个新区块,也就是每10分钟全网达成一个“共识”,所以通常的比特币交易需要十多分钟才能完成。 这将得到证实。 在早期算力不是很高的时候,可能需要一个小时(6个Blocks),大家才认为这笔交易是靠谱的。

显然,更短的共识时间会给用户带来更好的体验。 为什么比特币不缩短区块生成时间? 这是因为更快的共识间隔会在一定程度上增加“中心化矿池”的优势。 所谓“矿池”,就是比特币矿工聚集在一起挖矿。 矿工无条件服从矿池的指令,最终同意矿池分享收益。 显然,作为一个去中心化的系统,比特币不希望出现这种中心化。 矿池还有一个额外的优势。

当矿工A挖出一个新区块时,他会广播这个区块,其他人收到消息后,会立即根据新区块开始工作。 而其他人在“A挖了一个新区块”和“收到A广播的消息”之间的计算实际上是浪费了,而中心化矿池中的其他矿工则没有。 会出现这个问题,因为他们可以更快的获取到新生成区块的信息,并立即在新区块的基础上开始工作。

以太坊Ethereum区块链技术开发讲解

广播时间可能需要十几秒,10分钟不是很重要,但是如果缩短共识间隔时间,中心化矿池的优势会越来越明显。 而以太坊通过引入“Uncle Block”的概念解决了这个问题,将共识间隔缩短至15秒,与比特币相比,支付确认速度有了很大的提升。

在比特币的区块链中,一个区块只能有一个父块和一个子块。 但是在以太坊中,一个新生成的块可以有一个父块和几个叔块。 回到上面的例子,如果在A已经挖出新区块而其他人还没有收到广播,但是因为广播晚了没有被大家接受的这段时间有人挖了一个新区块,那么这个区块可能会变成下一个区块的“叔块”——这个块所代表的工作量证明将被认为是下一个块的一部分(即这个人挖出下一个块的难度降低),叔块只提供工作量证明其中包含的交易无效。 这样就弥补了低block interval情况下client收到broadcast较晚的劣势。 具体来说,直接叔块提供50%的工作量证明,二代叔块提供25%的工作量证明等,最多5代叔块会被认可。

以太坊Ethereum区块链技术开发讲解

堵塞

在区块链技术中,数据以电子记录的形式永久存储,存储这些电子记录的文件称为“区块”。 区块按时间顺序一个一个生成,每个区块记录其创建过程中发生的所有价值交换活动,所有区块聚合形成一个记录集合。

块结构(BlockStructure)

区块会记录区块生成时间段内的交易数据,区块体实际上是交易信息的集合。 每个区块链的结构设计可能不完全相同,但大的结构分为两个部分:header和body。 区块头用于链接到前一个区块,为区块链数据库提供完整性保证,而区块体则包含区块创建过程中发生的所有价值交换的经过验证的记录。

以太坊Ethereum区块链技术开发讲解

区块结构有两个非常重要的特点:第一,每个区块记录的交易都是前一个区块形成之后和区块创建之前发生的价值交换活动。 这个特性保证了数据库的完整性性。 其次,在大多数情况下,一旦一个新的区块被添加到区块链的末端,这个区块的数据记录就不能再被更改或删除。 这个特性保证了数据库的严谨性,即不可篡改。

顾名思义,区块链就是区块以链的形式组合起来,这样形成的数据库称为区块链数据库。 区块链是系统中所有节点共享的交易数据库,这些节点基于价值交换协议参与区块链网络。

区块链是怎么做到的? 由于每个区块的区块头都包含了前一个区块的交易信息的压缩值,因此从创世区块(第一个区块)到当前区块形成一条长链。 由于在不知道前一个块的“交易缩影”值的情况下无法生成当前块,因此每个块必须按时间顺序跟随前一个块。 这种所有块都包含对先前块的引用的结构允许现有的块集形成一个长链数据。 “区块+链”的数据存储结构如下图所示。

以太坊Ethereum区块链技术开发讲解

我们引用《区块链:互联网金融的终局之战》(肖峰)的一段话来概括区块链的基本结构:“人们将一段时间内产生的信息(包括数据或代码)打包成一个区块,涵盖Timestamp,与前一个区块相连,每一个下一个区块的页首都包含前一个区块的索引数据,然后在这个页写入新的信息,形成一个新的区块,首尾相接,最终形成区块链。” 这种结构的神奇之处:区块(全历史)+链(全验证)=时间戳

“区块+链”的结构为我们提供了数据库的完整历史。 从第一个区块到最新区块,系统的所有历史数据都存储在区块链上。

区块链为我们提供了数据库中每一条数据的搜索功能。 区块链上的每一笔交易数据,都可以通过“区块链”的结构追根溯源,一一核对。

分布式结构——开源、去中心化协议

不赞成在一台或几台中心化计算机上记录和存储数据,而是让每个参与数据交易的节点记录和存储所有数据。

分布式簿记 - 会计责任的分散

通过分布式记账、分布式通信、分布式存储这三个“分布式”,我们可以发现,没有人、没有组织、甚至任何国家都可以控制这个系统。 系统中的数据存储、交易验证、信息传输过程都是去中心化的。 在没有中心的情况下,大规模参与者达成共识,共同构建区块链数据库。

非对称加密算法:在区块链系统中,所有权验证机制的基础是非对称加密算法。 常见的非对称加密算法有RSA、Elgamal、DH、ECC(椭圆曲线加密算法)等。

以太坊Ethereum区块链技术开发讲解

合约(智能合约)

智能合约是代码和数据的集合,存储在区块链的特定地址中。 智能合约更像是区块链中的自动化代理(或机器人或 NPC)。 智能合约有自己的账户,可以自动执行一些由时间或事件驱动的功能,比如相互之间传递信息。 ,修改区块链的状态(账户信息等),以及图灵完备的计算(图灵机能做的一切,通俗点说就是通用编程语言能做的一切)。 以太坊的智能合约是以太坊特有的字节码,称为 EVM 字节码。

1. 智能合约高级语言

用户不可能直接编写 EVM 字节码,因此以太坊提供了几种高级语言来编写智能合约。

1)Solidity:类JavaScript,是以太坊推荐的旗舰语言,也是最流行的智能合约语言。 具体用法可以参考Solidity文档。

2)蛇:类蟒蛇

3) LLL: Lisp-like

可以根据不同的习惯选择不同的高级语言。 这里选择了最流行的 Solidity。

2.相关概念

以下概念可能被智能合约用到,这里不再详细介绍。 如果想了解更多,可以参考智能合约新手教程。

智能合约和 DApp

以太坊社区将基于智能合约的应用称为去中心化应用(Decentralized App)。 DApp 的目标是(或者应该是)为你的智能合约提供一个友好的界面,再加上一些额外的东西,比如 IPFS(可以存储和读取数据的去中心化网络,不是来自以太坊团队但有类似的精神)。 DApp 可以运行在可以与以太坊节点交互的中心化服务器上​​,也可以运行在任何以太坊对等节点上。 (花点时间想一想:与普通网站不同,DApps 不能在普通服务器上运行。它们需要向区块链提交交易并从区块链而不是中心化数据库中读取重要数据。相比于典型的用户登录系统,用户可能表示为钱包地址,其他用户数据存储在本地。许多事情将与当前的 Web 应用程序架构不同。)

DApp流程:用Solidity(或其他语言)编写智能合约(后缀为.sol),使用solc编译器将.sol合约编译成EVM字节码,将编译好的字节码传回dapp前端编译编译好的智能合约部署到区块链,区块链返回智能合约地址+ABI(合约接口的二进制表示。合约接口用JSON表示,包括变量、事件和可以调用的方法)。 前端通过Address+ABI+nonce调用智能合约。 智能合约开始处理。

以太坊Ethereum区块链技术开发讲解

智能合约编译器

Solidity 智能合约可以通过在线 Solidity 实时编译器以多种方式编译。 在线Solidity实时编译器安装solc编译器,通过web3.eth.compile.solidity在客户端javascript控制台编译。 但这需要环境中安装solc编译器。 用于构建 solidity 合约的 Meteor dapp Cosmo Mix IDE 以太坊钱包,在这里选择 solc 和 web3.eth.compile.solidity 方法。

1.get安装

参考:去以太坊客户端。 安装比较简单,这里详细介绍一下。

2.Solc安装

1) 作为 cpp-ethereum 的一部分安装。 如果cpp-ethereum是通过编译安装的(参考:),那么solc编译器会作为cpp-ethereum的子工程被编译安装,solc编译器可以在webthree-umbrella/build/solidity/solc目录可执行文件中找到文件。

以太坊Ethereum区块链技术开发讲解

然后,只需在/bin 或/usr/bin 目录中创建一个软链接即可。

ln -s /home/vagrant/Code/workspace/webthree-umbrella/build/solidity/solc/solc /bin/solc

2)单独安装solc

参考:

通过npm安装:这个比较简单,运行npm install solc即可,但是我在控制台没有找到solc 通过apt-get安装:

sudo add-apt-repository ppa:ethereum/ethereum

sudo apt-get 更新

sudo apt-get 安装 solc

哪个解决方案

将solc添加到geth中,直接使用(在geth中输入)

admin.setSolc('path/to/solc')

从源码编译安装

该方法与安装cpp-ethereumle类似,只是最后的编译步骤改为:

cd 网络三伞

./webthree-helpers/scripts/ethupdate.sh --no-push --simple-pull --project solidity # 更新 Solidity repo

./webthree-helpers/scripts/ethbuild.sh --no-git --project solidity --cores 4 -DEVMJIT=0 -DETHASHCL=0 # 仅构建 Solidity

测试:打开geth控制台,输入:web3.eth.getCompilers(),会打印

以太坊Ethereum区块链技术开发讲解

智能合约体验

1. 编写一个简单的合约

直接在控制台编译一个简单的合约代码

> source = 'contract test { function multiply(uint a) returns(uint d) { return a * 7; } }'

> clientContract = eth.compile.solidity(source).test

编译返回结果的JSON格式如下

以太坊Ethereum区块链技术开发讲解

在,

代码:编译后的 EVM 字节码

info:编译器返回的元数据

abiDefination:Application Binary Interface definition.具体接口规则见这里

compilerVersion:编译这段代码的solidity编译器的版本

developerDoc:面向开发者的Natural Specification Format,类似于Doxygen。具体规则见这里

语言:合约语言

languageVersion:合约语言版本

来源:源代码

userDoc:以太坊的用户自然规范格式,类似于 Doxygen。

编译器返回的 JSON 结构反映了合约部署的两种不同路径。 info信息实际存在于中心化云端,作为元数据信息公开验证合约代码在区块链中的执行情况。 通过创建交易将代码信息部署到区块链中。

2. 创建和部署合约

在继续执行此步骤之前,请确保您有一个未锁定的帐户并且帐户中有余额。 (你可以创建自己独立的测试网络,也就是你自己的区块链,初始化时可以初始化一些有余额的账户)。 参考:测试网络。

以太坊Ethereum区块链技术开发讲解

现在是时候在区块链中创建合约了。 创建合约的方式是发送交易,交易的目的地址为空地址,数据为前面JSON结构中的code字段。

创建合约的过程如下:

1) var primaryAddress = eth.accounts[0]

2) var abi = [{ constant: false, inputs: [{ name: 'a', type: 'uint256' } ]}]

3) var MyContract = eth. 合同(abi)

4) var contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection}) //arg1, arg2, ... 是构造参数,这里没有,需要去掉。 红色部分替换为之前生成的获取账号的代码。

以太坊Ethereum区块链技术开发讲解

定义一个abi(abi是js的数组,否则不成功)

以太坊Ethereum区块链技术开发讲解

创建智能合约

以太坊Ethereum区块链技术开发讲解

发送交易部署合约

以太坊Ethereum区块链技术开发讲解

如果交易处于待处理状态,则表示您的矿机没有在挖矿

以太坊Ethereum区块链技术开发讲解

开始一个矿工

miner.setEtherbase(eth.primaryAddress) //设置挖矿账户

矿工开始(8)

eth.getBlock('pending', true).transactions

这时候发现交易已经在区块中了

以太坊Ethereum区块链技术开发讲解

但是,您会发现交易仍在进行中。 这是因为没有人协助计算和验证交易区块。 这时候你只需要再启动一台矿机即可。

矿工开始(8)

参考:私有测试网

发现block 1部署了交易

以太坊Ethereum区块链技术开发讲解

以太坊Ethereum区块链技术开发讲解

与合约交互

通过eth.contract()可以定义一个合约对象,其中包含变量合约接口的abi

Multiply7 = eth.contract(clientContract.info.abiDefinition);

var myMultiply7 = 乘法 7。 在(合同。地址);

以太坊Ethereum区块链技术开发讲解

以太坊Ethereum区块链技术开发讲解

此时可以调用智能合约的函数

myMultiply7.multiply.call(3) 或

我的乘法7。 乘。 sendTransaction(3, {from: contract.address})

以太坊Ethereum区块链技术开发讲解

结构体

客户端部署好之后,就可以使用web3j访问以太坊客户端了。 结构如图所示:

以太坊Ethereum区块链技术开发讲解

伽米谷大数据区块链技术普及:以太坊区块链技术发展解读感兴趣的朋友请关注伽米谷大数据,未来会继续分享大数据、人工智能和区块链技术发展的知识。