以太坊教程——深入了解以太坊!

以太坊教程:在这个以太坊教程博客中,我将解释以太坊架构的内部工作,我还将通过一个简单的智能合约向你展示以太坊的实现。我认为以太坊是一种可编程区块链,将来会为大多数B2C企业服务。以太坊授予开发人员创建在区块链上执行的复杂模型的自由,而不是将其限制为比特币区块链等预定义操作。

通过这种方法,以太坊已经成为众多分散应用程序和组织的平台,其中包括但不限于加密货币。

通过这个“以太坊教程”博客的运行,我将以详尽的方式介绍各种主题。这些主题包括:

  • 以太坊账户
  • 以太坊虚拟机
  • 以太坊网络
  • 以太和gas
  • 以太坊挖矿

以太坊教程:以太坊账户

以太坊网络有两种类型的帐户,即:

  • 外部账户
  • 合约账户

外部和合约的这些帐户被称为“状态对象”并且包括以太坊网络的“状态”。每个状态对象都有明确定义的状态。对于外部帐户,状态包括帐户余额,而对于合约帐户,状态由内存存储和余额定义。

我将外部帐户简称为帐户。这些帐户由网络的外部代理所代表,包括每个普通用户,矿工,自动代理等。

这些帐户通常在RSA等公钥加密算法的帮助下进行控制。外部帐户的主要目的是作为用户与以太坊区块链交互的媒介。

另一方面,合约帐户是驻留在特定地址的区块链上的代码集合。这些合约由外部帐户或其他合约通过特定的号召性用语功能调用。这些合约是用高级脚本语言编写的,如Solidity,Serpent或LLL。驻留在以太坊区块链中的每个合约都以称为EVM(以太坊虚拟机)字节码的特定格式存储,该字节码是以太坊特定的二进制格式。

以太坊教程:以太坊虚拟机

Ethereum以质朴的方式定义了一组通用协议,这些协议已成为分散应用程序开发的支柱。其中的核心是以太坊虚拟机。下图解释了架构:

值得注意的是,以太坊虚拟机不仅完全沙盒化,而且完全隔离。这意味着当前在EVM上运行的代码无法访问网络或文件系统,并且可以谨慎地访问其他合约。

现在我们了解了平台的核心,让我们深入了解网络节点。

以太坊教程:以太坊网络

以太坊网络是公共区块链网络。它构成了在网络上运行的所有去中心化的节点应用程序和组织的基础。网络由两种类型的节点组成,即完整节点和轻量级节点。

完整节点包含自创世块以来的整个交易历史。它们是区块链网络完整性的完整证明。完整节点必须包含根据以太坊规范设置的规则验证的每个交易。

另一方面,轻量级节点仅包含整个区块链的子集。这些类型的节点主要用于电子钱包,其本质上必须是轻量级的,因此整个区块链不能存储在它们上面。相反,这些节点不验证每个块或交易,也可能没有当前区块链状态的副本。他们依靠完整的节点为他们提供缺失的细节(或者只是缺少特定的功能)。轻型节点的优势在于它们可以更快地启动和运行,可以在更多计算/内存受限的设备上运行,并且不会占用几乎同样多的存储空间。

每个公共区块链都附有一种货币。以太坊也不例外。让我们深入了解以太坊的加密货币。

以太坊教程:以太和gas

以太是用于支付以太坊网络上的交易的加密货币的名称。除了支付一般交易和服务外,Ether还用于购买Gas,而Gas又用于支付EVM内的计算费用。

以太是公制单位,有很多面额,有助于准确支付交易和gas。最小面额a.k.a基本单位称为Wei。面额及其具体名称见下表:

如前所述,我们知道EVM负责运行部署在其网络上的代码。那么是什么阻止某人在EVM上运行无限循环并完全超载其内存?这就是Gas的概念所在。

gas用作支付网络上的计算资源的度量。网络上的每个合约都有一套可用于计算的最大gas量。这被称为“gas limit”其他相关gas术语如下:

  • gas price:这是以太币及其他面额等代币的gas成本。为了稳定gas的价值,gas价格是一个浮动价值,如果代币或货币的成本波动,gas价格变化以保持相同的实际价值。
  • gas fee:这实际上是运行特定交易或计划(称为合约)所需支付的gas量。 因此,如果有人试图运行一段永远运行的代码,合约最终将超过其gas限制,并且调用合约的整个事务将回滚到其先前的状态。

现在我们了解了货币,让我们来看看产生新货币的过程。

以太坊教程:挖矿

与其他公共区块链技术一样,以太坊通过基于激励的模型确保安全性。这称为工作量证明机制。下图显示了以太坊采矿的工作原理:

从技术角度来看,所使用的工作量证明算法称为Ethash,它是一种受Dagger-Hashimoto算法启发的哈希算法。

现在我们已经看到了以太坊的工作架构并讨论了它的基本元素,让我们看看现实问题和以太坊方法来解决这个问题。

以太坊教程:去中心化中人们资金使用案例

问题陈述:一个好的“想法”并不是当今世界开展成功企业的一切。实施一个想法需要大量的资金和努力。这就是像“Kickstarter”这样的组织进入画面的地方。他们为项目提供捐赠所需的公众曝光项目以使其获得运行,但这种动机的集中式架构有其缺点,主要在于奖励的处理方式。由于集中管理机构做出所有决策,因此系统容易出现以下规则:

  • 任何错过了广告系列截止日期的人都无法再参与其中。
  • 任何改变主意的捐助者都无法离开。

做法:

我们采用干校的方法来解决问题,如下图所示:

解决方案:

以下是上述问题陈述的solidity智能合约。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
pragma solidity ^0.4.16;

interface token {
function transfer(address receiver, uint amount);
}

contract Crowdsale {
address public beneficiary;
uint public fundingGoal;
uint public amountRaised;
uint public deadline;
uint public price;
token public tokenReward;
mapping(address => uint256) public balanceOf;
bool fundingGoalReached = false;
bool crowdsaleClosed = false;

event GoalReached(address recipient, uint totalAmountRaised);
event FundTransfer(address backer, uint amount, bool isContribution);

/**
* Constrctor function
*
* Setup the owner
*/
function Crowdsale(
address ifSuccessfulSendTo; // the address of the owner when funding is successful
uint fundingGoalInEthers; // target amount to raise
uint durationInMinutes; //given time
uint etherCostOfEachToken; //cost of equity in ether
address addressOfTokenUsedAsReward; //token address
) {
beneficiary = ifSuccessfulSendTo;
fundingGoal = fundingGoalInEthers * 1 ether;
deadline = now + durationInMinutes * 1 minutes;
price = etherCostOfEachToken * 1 ether;
tokenReward = token(addressOfTokenUsedAsReward);
}

/**
* Fallback function
*
* The function without name is the default function that is called whenever anyone sends funds to a contract
*/
function () payable {
require(!crowdsaleClosed);
uint amount = msg.value;
balanceOf[msg.sender] += amount;
amountRaised += amount;
tokenReward.transfer(msg.sender, amount / price);
FundTransfer(msg.sender, amount, true);
}

modifier afterDeadline() { if (now <= deadline) _; }

/**
* Check if goal was reached
*
* Checks if the goal or time limit has been reached and ends the campaign
*/
function checkGoalReached() afterDeadline {
if (amountRaised >= fundingGoal){
fundingGoalReached = true;
GoalReached(beneficiary, amountRaised);
}
crowdsaleClosed = true;
}

/**
* Withdraw the funds
*
* Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,
* sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw
* the amount they contributed.
*/
function safeWithdrawal() afterDeadline {
if (!fundingGoalReached) {
uint amount = balanceOf[msg.sender];
balanceOf[msg.sender] = 0;
if (amount > 0) {
if (msg.sender.send(amount)) {
FundTransfer(msg.sender, amount, false);
} else {
balanceOf[msg.sender] = amount;
}
}
}

if (fundingGoalReached && beneficiary == msg.sender) {
if (beneficiary.send(amountRaised)) {
FundTransfer(beneficiary, amountRaised, false);
} else {
//If we fail to send the funds to beneficiary, unlock funders balance
fundingGoalReached = false;
}
}
}
}

如果你有兴趣学习solidity,请查看我们关于Solidity Programming的博客,该博客用于开发个性化智能合约。

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

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是以太坊教程——深入了解以太坊!