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

人类的整个历史是不断从链条中解脱出来,并创造出新的甚至更强大的链条。 (匿名作者)

通过分析众多区块链项目(比特股,超级账本,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. 现代区块链具有实施业务逻辑的能力,在区块链中称为智能合约。 智能合约的逻辑以各种高级语言实现。

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

区块链架构


区块链组件


每个参与者都可以使用区块链的完整副本(完整节点)来运行其节点。 可以在区块链上记录交易的完整节点称为共识节点 (见证人)或矿工。 仅验证事务的正确性的完整节点称为审核节点轻客户端不存储区块链的完整副本,而是使用完整节点与网络进行交互。
大多数用户使用轻客户端或Web钱包完成交易。 所有节点都相互连接。 通过这组元素,网络体系结构变得更加稳定:

图片

交易生命周期


让我们看一下事务生命周期,并进行部分分析:

图片

区块链技术


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

身份证明


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

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

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

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

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

私钥必须保密并保持安全。 公钥是众所周知的。 如果私钥丢失,将无法恢复对资产(硬币)的访问,金钱将永远丢失。 因此,可靠存储私钥的任务非常重要,因为 这不是银行,您可以随时随身带着护照来恢复您的帐户。 与闪存驱动器类似,整个行业都在生产所谓的冷加密钱包:

图片

或者您可以使用更可靠的方法作为示例,以去除令牌上私钥的值:

图片

交易次数


有关交易结构的更多信息,请参阅概括地说,交易中的比特币一文 。 对我们来说很重要的一点是,每笔交易至少应包含以下数据:

 From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 -    To: 0x367adb7894334678b90fe7882a5b06f7fbc783a -    Value: 0.0001 -   Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef -   

接下来,使用私钥对交易进行签名,然后将其发送到区块链中的所有验证交易有效性的节点(请参见“ 简略协议”中有关比特币操作的详细信息)。 交易验证算法很简单,包括两个步骤

交易区块


在检查事务的有效性之后,节点从中形成块。 除事务外,还将前一个块的哈希,一个数字(Nonce计数器)写入该块,并使用SHA-256算法计算当前块的哈希。 哈希必须具有确定的复杂性条件。 例如,在比特币网络上,哈希复杂度根据网络容量每2周自动更改一次,因此大约每10分钟生成一次该区块。 复杂度由以下条件确定:找到的哈希值必须小于预定数量。 如果不满足此条件,则将1添加到Nonce,并重复进行哈希计算。 要选择哈希,使用Nonce字段,因为 这是块中唯一可以更改的数据,其余应保持不变。 正确的散列开头必须有一定数量的零,例如,真实的散列之一:

 000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91 

成功找到哈希值可以证明比特币或以太坊网络已完成的工作(工作量证明,PoW)。 类似于金矿开采,发现哈希的过程称为采矿。 该名称准确地确定了过程的本质,因为 有一个简单的选项枚举,如果有人找到合适的哈希,那么这真是好运。 这就是如何以吨煤of石找到真正的金块。 现在,该区块的奖励为12.5 BTC,如果您将3900美元乘以当前的比特币汇率,您将获得一公斤以上的纯金。 有东西要争取!

成功找到哈希后,该块和找到的哈希本身将由下一个块写入区块链。 有关块结构的更多详细信息,请参见《 简明扼要的区块链中的比特币》一文 ,下面我将给出一个简化图:

图片

区块链始于一个尚无上一区块哈希值的区块。 区块链中只有一个这样的区块,并有自己的名称Genesis区块。 其余的块具有相同的结构,它们的区别仅在于事务数。 当前在比特币或以太坊中创建的真实交易和区块可以在区块浏览器中查看。

比特币中的块大小限制为1MB,并且交易中的最小信息量约为200个字节,一个区块中的最大信息量约为6,000个交易。 顺便说一下,这里是比特币的性能,每个人都在笑:大约每10分钟* 60秒= 600秒生成一个块,这给出了大约10 TPS的正式性能。 尽管实际上-这不是性能,但是是一种自觉实现的工作算法。 以太坊刚刚将15秒的区块生成时间用于竞争。 生产力正式起飞。 因此,在使用PoW作为共识的区块链中,比较性能通常毫无意义,因为 它取决于计算缓存的复杂度,可以将其分配给任何缓存。

前叉


例如,如果多个节点找到满足复杂性条件但具有不同含义(换句话说,达成不同共识)的哈希并将其写入区块链,会发生什么? 让我们看看区块链如何保护自己免受这种情况的影响。 在这种情况下,发生了所谓的fork(``fork''),并且区块链具有链的两个版本:

图片

接下来会发生什么? 此外,一部分网络从一个链开始在N + 2块上工作,而另一条链则从下面开始:

图片

其中一些区块将在较早之前发现并发送到区块链,然后根据规则,区块链将不得不切换到更长的链并取消替代区块中的所有交易:

图片

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

所谓的51%攻击也将观察到带有叉状区块的情况-这是一群矿工试图建立替代区块链,试图通过其欺诈性交易取消该区块链的时候。 尽管目前,将精力花在诚实采矿上比欺诈更有价值。

共识


为了将区块写入区块链,网络必须达成共识。 让我们回顾一下在计算机通信网络中达成共识的任务。 该问题被表述为拜占庭将军BFT( 拜占庭容错 )的任务。 省略对拜占庭军队问题的图示说明,可以将问题表述为:如果某些网络节点可以自觉地使它们变形,那么网络节点如何才能达到共同的结果。 解决BFT问题的现有算法表明,如果欺诈者少于1/3,则网络可以正常运行。 为什么BFT共识没有应用于比特币网络? 为什么使用PoW? 有以下几个原因:

  • BFT可以与少量固定的节点集协同工作,并且在公共区块链中,节点数是不可预测的,此外,可以任意打开和关闭节点。
  • 有必要激励人们启动区块链节点。 为此,人们必须获得奖励。 在BFT中,形式上没有任何要获得的奖励,但是在PoW中,对于奖励的意义在每个人的直觉上都是可以理解的:处理器在查找块哈希过程中消耗的电力。

除了PoW外,现代区块链还使用了其他一些共识性问题,例如:


让我们关注PoS的共识,因为 PoS及其变体在私有区块链中使用最广泛。 为什么要私下? 一方面,PoS的特性优于PoW,因为 为了达成共识,需要更少的计算资源,这意味着将数据写入区块链的速度提高了。 但是另一方面,PoS具有更多的欺诈机会,因此,要消除这种欺诈机会,必须知道区块链中的所有参与者。

PoS的共识基于对节点的选择,该节点可以根据账户中的资金金额来记录区块链上的交易区块,确切地说,不是账户中的资金金额,而是抵押中的金额。 您的保证金越多,网络选择您的节点记录区块的可能性就越大。 如果单位无效,则押金将不予退还。 因此,实现了欺诈保护。 提供以下PoS变体:

  • 共识委托PoS(DPoS)将参与者分为“投票”和“验证”。 硬币持有者(投票参与者)将其验证和记录区块链交易的权利委托给其他参与者。 因此,验证者会完成所有计算工作并为此获得奖励,并且有投票权的参与者的存在保证了验证者的诚实,因为 它们可以随时更改。
  • 共识LPoS(租赁权益证明)使您可以将资金租赁给其他节点,以便他们有更大的机会检查区块。 T.O. 您可以获取交易佣金,而无需参与交易验证本身并阻止挖掘。

还有许多共识尚未广泛传播,我将在此处简单列出以供参考,例如,可在文章: 区块链中的共识算法中找到共识算法本身的综述。

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

可靠性和区块链部署模型


公共区块链

每个人都可以连接和查看信息甚至连接自己的节点,并且信任建立在PoW共识基础上,从而实现了PublicPermissionless区块链的另一个名称的稳定性。

私人区块链

私有私有许可的区块链 。 在这些区块链中,只有特定的参与者组(组织或人员)可以访问信息。 此类区块链由组织构建,以提高整体利润或效率。 参与者的共同目标以及PoS和BFT共识算法可确保其可靠性。

区块链财团

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

智能合约


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

使用智能合约可以实现哪些业务逻辑? 实际上,并没有那么多,例如根据来自区块链的数据检查条件,根据这些条件更改数字资产的所有者,将数据写入区块链内部的永久存储。 该逻辑以特殊的高级语言Solidity实现。

使用智能合约实现的功能的经典示例是发行ICO代币。 例如,我实施了一份智能合约,用于发行适度的5亿个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 (ie 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相同的常规数据库技术,以解决其特定的任务范围;
  • 区块链将成为广泛使用的协议,例如Internet上的HTTP。
  • 区块链将成为地球新金融和政治体系的基础!

我们在对的下一部分现在存在blokcheyny和他们都在不同的行业使用的外观。

这仅仅是开始!

所有三篇文章:


我们应该建立什么区块链?
区块链:我们应该建立一个案例?
区块链:我们应该建立什么PoC?

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


All Articles