我们应该构建什么区块链?

整个人类历史就是一个不断摆脱束缚、创造新的、更强的束缚的过程。 (匿名作者)

通过分析众多区块链项目(Bitshares、Hyperledger、Exonum、以太坊、比特币等),我了解到,从技术角度来看,它们都是建立在相同的原理之上的。 区块链让人想起房屋,尽管房屋的设计、装饰和用途各不相同,但它们都有以某种方式相互连接的地基、墙壁、屋顶、窗户、门。 如果您了解建筑设计的基本原理并了解所用材料的特性,那么您就可以确定特定房屋的预期用途。 目前,区块链出现了一种情况,大家都听说过它,但很少有人了解它的架构和运行原理。 因此,人们对使用区块链技术的原因和方式存在误解。

在本文中,我们将分析所有区块链共有的属性和原理。 接下来,让我们看看使用区块链可以解决的问题,并强化材料,让我们在我们的虚拟网站上构建一个小而真实的区块链!

那么,让我们记住区块链最初解决了哪些问题。

我相信很多人都会谈论分布式、去中心化、公共且不可变的数据库。 但为什么这一切都是必要的呢?

我更喜欢通过阅读标准来开始研究任何技术,因为有关所研究主题的所有文章和书籍都基于它们。 但目前还没有区块链标准;ISO仅创建了 委员会 为了他们的发展。 目前,每个公链项目都有自己的白皮书文件,本质上是一份技术规范。 第一个众所周知的区块链项目是比特币网络。 前往该网络的官方网站并 一切开始的地方。

区块链挑战

所以,区块链在比特币先锋网络中解决的任务就是在没有中介的非可信环境下进行数字资产(资产)所有权的可信转移。 例如,在比特币网络中,数字资产就是比特币数字货币。 而比特币和其他区块链的所有技术解决方案都归结为解决这个问题。

区块链解决的问题

假设某个金融组织声称它已经在世界各地建立了一个网络,借助该网络可以将资金转移给任何人。 你会相信她吗? 如果这个组织是 Visa 或 MasterCard,你很可能会相信,但相对而言,如果是 AnonymousWorldMoney,你可能不会相信。 为什么? 但因为我们非常清楚私营公司是如何制造分布式系统的,出于什么目的,以及这会导致什么。 让我们仔细看看此类系统的问题以及如何使用区块链技术解决这些问题。

假设在条件 AnonymousWorldMoney 中有一些带有数据库的服务器,如果有多个服务器位于不同的数据中心,那就太好了。 当发送者转账时,会注册一笔交易,该交易会被复制到所有服务器,然后资金到达接收者。

我们应该构建什么区块链?

在理想的情况下,这个方案效果很好,但在我们的方案中会出现以下问题:

  1. 一方面是识别参与者的问题,另一方面是交易匿名的需要。 那些。 您需要将钱转给特定的接收者,并且以这样一种方式,除了交易的参与者之外,没有人知道这笔交易。 银行拥有与特定个人或法人实体关联的帐号和银行卡,银行保密可以保护交易信息。 谁保证有条件的 AnonymousWorldMoney 不会将个人数据和交易信息用于自己的目的?
  2. 如何确保收款人准确收到转账给他的金额? 相对而言,发送方转账了 100 美元,接收方收到了 10 美元。 发件人带着收据来到 AnonymousWorldMoney 办公室,店员出示了他的版本,上面写着发件人只转了 10 美元。
  3. 不可信环境的问题,例如,称为双重支出的骗局。 不道德的参与者可以多次花费他的余额,直到付款被复制到所有服务器。 CAP定理当然,没有人取消,协议最终会达成,但有人不会因为所提供的服务或商品而收到金钱。 因此,如果对支付组织或交易参与者没有完全的信任,那么就需要构建一个不是基于信任,而是基于密码学的网络。
  4. 有条件的 AnonymousWorldMoney 的服务器数量有限,可能会无意或由于恶意意图而变得不可用。
  5. AnonymousWorldMoney 将收取自己的有形佣金。
  6. 控制的可能性。 事实证明,在比特币的运行过程中,人们不仅希望互相转账,还希望检查交易的各种条件、编程工作场景、根据条件自动执行操作等。

区块链如何解决这些问题

  1. 参与者的身份识别是使用一对密钥进行的:私钥和公钥,数字签名算法唯一地识别发送者和接收者,使他们的身份保持匿名。
  2. 交易被收集到块中,计算块的哈希值并将其写入下一个块。 这种在块中记录哈希值的序列赋予了区块链技术它的名称,并且它也使得不可能在不知不觉中更改/删除块或块中的单个交易。 因此,如果一笔交易包含在区块链中,您可以确定其数据将保持不变。
  3. 通过就哪些数据被视为有效以及哪些数据被丢弃达成网络共识,可以防止双花欺诈。 在比特币网络中,共识是通过工作量证明(PoW)来实现的。
  4. 网络的可靠性是通过区块链是公共的这一事实来实现的,每个参与者都可以运行自己的节点,接收区块链的完整副本,此外,还可以独立地开始检查交易的正确性。 应该指出的是,现代区块链不仅可以构建公共(开放)区块链,还可以构建私有(封闭)区块链,以及使用组合方案。
  5. 区块链不会完全摆脱佣金,因为…… 你必须付钱给支持网络的人,但在区块链中,佣金的必要性被如此令人信服地证明,其必要性是毫无疑问的。
  6. 现代区块链具有实现业务逻辑的能力,这在区块链中被称为智能合约。 智能合约的逻辑是用各种高级语言实现的。

接下来,我们将更详细地考虑这些解决方案。

区块链架构

区块链组件

每个参与者都可以使用区块链的完整副本(完整节点)启动自己的节点。 能够在区块链上记录交易的全节点称为 共识节点 (见证人)或矿工(矿工)。 只检查交易正确性的全节点称为 审计节点 (审计)。 轻客户端 (轻客户端)不存储区块链的完整副本,而是使用完整节点与网络交互。
大多数用户使用轻客户端或网络钱包进行交易。 所有节点都相互连接。 有了这组元素,网络架构变得更加稳定:

我们应该构建什么区块链?

交易生命周期

让我们看一下交易生命周期并将其逐个分解:

我们应该构建什么区块链?

区块链技术

让我们更详细地讨论技术解决方案及其相互之间的联系。

鉴定

每笔区块链交易都必须经过数字签名。 因此,要完成一笔交易,每个参与者都必须拥有一对密钥:私有/公共。 有时一对钥匙被称为钱包,因为密钥与参与者的唯一数字地址和余额唯一关联。 实际上,键和地址只是不同数字系统中的数字字符串。 密钥和钱包地址示例:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

为了在区块链中创建数字签名,需要使用基于椭圆曲线的算法:椭圆曲线数字签名算法(ECDSA)。 为了使其正常工作,私钥(256 位数字)通常是随机获取的。 密钥选项的数量是2的256次方,因此我们可以讨论匹配私钥值的实际不可能性。

接下来,通过将公钥的值乘以位于椭圆曲线上的点的坐标,从私钥获得公钥,从而得到同一曲线上的新点的坐标。 此操作可确保您获得适合对交易进行数字签名的密钥对。 最后,钱包地址是从公钥唯一导出的。

有很多文章详细介绍了区块链中使用的密码学,例如: 比特币简而言之——密码学

私钥必须严格保密并妥善保管。 公钥是每个人都知道的。 如果私钥丢失,则无法恢复对资产(硬币)的访问,并且资金将永远丢失。 因此,安全存储私钥的任务极为重要,因为这不是一家您可以随时携带护照来恢复帐户的银行。 有一个完整的行业来生产所谓的冷加密钱包,类似于闪存驱动器:

我们应该构建什么区块链?

或者您可以使用更可靠的方法,例如,将私钥的值标记在令牌上:

我们应该构建什么区块链?

交易

有关交易结构的更多详细信息可以在文章中找到 比特币简而言之——交易。 对我们来说重要的是要了解每笔交易至少有以下数据:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции

接下来,使用私钥对交易进行签名并发送出去(详细信息请参见协议的操作) 比特币简而言之——协议)到区块链中检查交易有效性的所有节点。 交易验证算法并不简单,包括 两打台阶.

交易区块

检查交易的有效性后,节点将其形成区块。 除了交易之外,还将前一个块的哈希值和一个数字(Nonce 计数器)写入块中,并使用 SHA-256 算法计算当前块的哈希值。 哈希必须具有既定的复杂性条件。 例如,在比特币网络中,哈希的难度每两周自动改变一次,具体取决于网络的功率,因此大约每 2 分钟生成一个块。 复杂度由以下条件决定:找到的散列必须小于预定数。 如果不满足这个条件,则Nonce加10,重复计算hash的工作。 要选择哈希,请使用 Nonce 字段,因为这是块中唯一可以更改的数据;其余数据必须保持不变。 有效的哈希值必须具有一定数量的前导零,例如真正的哈希值之一:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

成功找到哈希值就是比特币或以太坊网络已完成工作的证明(工作量证明,PoW)。 寻找哈希值的过程称为挖矿,类似于金矿开采。 这个名字非常准确地定义了该过程的本质,因为有一个简单的选项搜索,如果有人找到合适的哈希,那么这真的很幸运。 这就像在成吨的废石中找到真正的金块一样。 现在的区块奖励为 12.5 BTC,如果将其乘以当前 3900 美元的比特币汇率,您将获得超过一公斤的纯金。 有东西值得奋斗!

成功找到哈希后,该块和找到的哈希本身将作为下一个块写入区块链。 有关块结构的更多详细信息可以在文章中找到 比特币简而言之——区块链,下面是一个简化的图:

我们应该构建什么区块链?

区块链从一个尚不具有前一个块的哈希值的块开始。 区块链中只有一个这样的区块,并且有自己的名称创世区块。 其余块具有相同的结构,仅交易数量不同。 当前在比特币或以太坊中创建的真实交易和区块可以在 块资源管理器.

比特币的区块大小限制为1MB,一笔交易的最小信息量约为200字节,一个区块中的最大交易数量约为6000笔。 顺便说一下,从这里开始,遵循大家嘲笑的比特币的性能:大约每 10 分钟 * 60 秒 = 600 秒生成一次块,这给出了大约 10 TPS 的正式性能。 虽然事实上这并不是生产力,而是刻意实现的工作算法。 在以太坊中,为了竞争,他们干脆将区块生成时间定为15秒。 生产力正式飙升。 因此,在使用 PoW 作为共识的区块链中,比较性能根本没有意义,因为它直接取决于缓存计算的复杂性,可以分配给任何值。

叉子

例如,如果多个节点发现满足复杂性条件的哈希值,但值不同(换句话说,它们达成不同的共识)并将块写入区块链,会发生什么情况? 让我们看看区块链如何防范这种情况。 在这种情况下,就会发生所谓的分叉,区块链有两个版本的链:

我们应该构建什么区块链?

接下来发生什么? 接下来,网络的一部分开始在一条链上的区块 N+2 上工作,另一部分则在另一条链上开始工作:

我们应该构建什么区块链?

其中一个区块将被更早地找到并发送到区块链,然后根据规则,区块链将不得不切换到更长的链并取消替代区块中的所有交易:

我们应该构建什么区块链?

同时,可能会出现一种情况,即参与者的交易仅在一个分叉区块中,该交易被取消。 因此,为了确保所需的交易记录在区块链中,有一个一般建议 - 在信任交易之前,您应该等到接下来的几个块被添加到区块链中。 不同区块链等待多少个区块的建议有所不同。 例如,对于比特币网络,最小为 2 个区块,最大为 6 个。

在所谓的 51% 攻击中,也会观察到与区块分叉相同的情况 - 这是一群矿工试图开发替代区块链,试图通过欺诈交易取消该链。 虽然目前来说,比起欺诈,把力量花在诚实挖矿上更有利可图。

共识

为了在区块链上记录一个区块,网络必须达成共识。 让我们记住在计算机通信网络中达成共识的任务。 该问题被表述为拜占庭将军 BFT 的任务(拜占庭容错)。 省略对拜占庭军队问题的生动描述,问题可以表述如下:如果某些网络节点可以故意扭曲网络节点,那么网络节点如何能够得出共同结果。 现有解决 BFT 问题的算法表明,只要欺诈者少于 1/3,网络就能正常运行。 为什么BFT共识没有应用到比特币网络上? 为什么需要使用 PoW? 有以下几个原因:

  • BFT 在一小部分固定节点上运行良好,但在公共区块链中,节点数量是不可预测的,而且节点可以随机打开和关闭。
  • 有必要激励人们推出区块链节点。 为此,人们必须得到奖励。 BFT 中没有正式的奖励,但 PoW 中的奖励是什么,每个人都直观地清楚:处理器在查找块哈希的过程中消耗的电力。

除了 PoW 之外,现代区块链中还使用了其他几种共识,例如:

  • PoS(权益证明)——在区块链上 Hyperledger
  • DPoS(委托权益证明)——在区块链上 BitShares
  • BFT 的修改:SBFT(简化 BFT)和 PBFT(实用 BFT),例如在区块链中 外泌体

让我们详细讨论一下 PoS 共识,因为…… 在私有区块链中应用最广泛的是 PoS 及其变体。 为什么要私下呢? 一方面,PoS的特性相比PoW更好,因为为了达成共识,需要更少的计算资源,这意味着将数据写入区块链的速度提高。 但另一方面,PoS 存在更多欺诈机会,因此为了消除这一点,必须了解区块链中的所有参与者。

PoS 共识基于选择一个节点,该节点可以根据账户中的资金量(或者更确切地说,不是账户中的资金量,而是抵押品中的资金量)将包含交易的块写入区块链,即您作为抵押品的资金越多,网络就越有可能选择您的节点来写入区块。 如果区块无效,押金将不予退还。 这可以防止欺诈。 PoS 有以下几种变体:

  • 委托权益证明(DPoS)共识将参与者分为“投票者”和“验证者”。 代币持有者(投票参与者)将验证和记录区块链上交易的权力委托给其他参与者。 因此,验证者完成所有计算工作并获得奖励,而投票参与者的存在保证了验证者的诚实,因为它们可以随时更改。
  • LPoS(租赁权益证明)共识允许您将资金出租给其他节点,以便它们有更好的机会验证区块。 那。 您无需参与实际的交易验证和区块挖矿,即可获得交易佣金。

还有许多其他共识尚未广泛使用,我只是在这里列出它们以供参考,并且可以在以下文章中找到共识算法本身的概述: 区块链中的共识算法.

  • PoET(经过时间证明)
  • PoC(容量证明)
  • PoB(燃烧证明)
  • PoWeight(重量证明)
  • PoA(活动证明)——PoW + PoS
  • PoI(重要性证明)

区块链的可靠性和部署模型

公共区块链

稳定 公共 或其他名称 无需许可的区块链 这是通过允许任何人连接并查看信息甚至连接自己的节点来实现的,并且信任是建立在 PoW 共识之上的。

私有区块链

私做 или 私人许可的区块链。 在这些区块链中,只有特定的参与者群体(组织或个人)可以访问信息。 此类区块链是由组织构建的,其目标是提高整体效益或效率。 它们的可靠性是由参与者的共同目标以及 PoS 和 BFT 共识算法来保证的。

区块链联盟

那里 联盟 или 公共许可的区块链。 这些是任何人都可以连接到查看的区块链,但参与者只有在其他参与者的许可下才能添加信息或连接他的节点。 此类区块链是由组织构建的,目的是增加客户或产品消费者或整个社会的信任。 在这里,可靠性也是通过参与者之间的信任以及相同的 PoS 和 BFT 共识算法来实现的。

智能合同

比特币之后实施的区块链在某种程度上增加了执行智能合约的能力。 本质上,智能合约是一种放置程序代码来执行的交易。 以太坊网络上的智能合约在 EVM(以太坊虚拟机)中执行。 要开始执行智能合约,它必须由另一笔交易显式启动,或者必须满足执行的先决条件。 智能合约的执行结果也将记录在区块链中。 从区块链外部接收数据是可能的,但极其有限。

使用智能合约可以实现哪些业务逻辑? 事实上,没有太多,例如,使用区块链中的数据检查条件,根据这些条件改变数字资产的所有者,将数据记录在区块链内的永久存储中。 逻辑是用特殊的高级语言Solidity实现的。

使用智能合约实现功能的一个典型例子是发行 ICO 代币。 例如,我实现了一个智能合约来发行适度的 500 AlexToken。 经过 Etherscan 中的链接

Solidity 语言的智能合约源代码

pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken 
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart, 
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO 
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance); 
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken 
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}

以及网络所看到的二进制表示

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

有关智能合约的更多详细信息可以在文章中找到: 以太坊中的智能合约是什么.

结论

我们列出了构建现代区块链的技术以及它们如何相互连接。 现在让我们明确哪些问题可以使用区块链来解决,哪些解决方案充其量是无效的。 因此,如果满足以下条件,则无需使用区块链:

  • 交易在可信环境中进行;
  • 中介委员会的存在不会使参与者的生活恶化;
  • 参与者不拥有可以代表数字资产的财产;
  • 数字资产没有分配,即该价值仅由一名参与者拥有或提供。

区块链的未来会怎样? 现在我们只能推测区块链技术发展的可能途径:

  • 区块链将成为与 SQL 或 NoSQL 相同的通用数据库技术,用于解决其特定范围的问题;
  • 区块链将成为一种广泛使用的协议,就像 HTTP 之于互联网一样;
  • 区块链将成为地球上新的金融和政治体系的基础!

在下一部分中,我们将了解目前存在哪些区块链以及它们为何在不同行业中使用。

这仅仅是开始!

来源: habr.com

添加评论