zoukankan      html  css  js  c++  java
  • 区块链1

    区块链技术主要分为2种:IBM的超级账本、以太坊。

     

    以太坊:

    一个比特币2万人民币。以太币比比特币还贵。

    比特币作为第一个数字货币,既没有强大的背景支持也没有内在价值。

    比特币底层的区块链技术作为一个去中心化的技术。

    以太坊是一个可编程的区块链,以太坊允许用户创建自己复杂的操作,以太坊作为一个平台为去中心化的不同的区块应用提供服务。

    一个比特币之前状态有5个账号,处理一笔交易,生成一个新的状态。

    如果有一个中央服务器,那么实现这个系统是一个很简单的事情,把状态写入服务器的硬盘上。

    比特币的去中心化的一次性的处理进程要求网络中的节点连续不断的去尝试对交易进行打包,被打成的包就称为区块。区块里面是包好的交易。由矿工把交易打成区块,然后由区块组成区块链。

    3个区块组成的区块链。每一个区块包含时间、随机数、上一个区块的hash值、交易。

    在这个范例中,用来验证一个区块是否有效的算法如下:

    1. 检查其引用的上一个区块是否存在并且有效.

    2. 检查这个区块的时间戳是否大于上一个区块的时间戳 并且小于 2 小时之内

    3. 检查这区块上的工作证明是否有效.

    4. S[0] 成为上一个区块的最末端的状态.

    5. 假设 TX 是这个区块的交易列表,且有 n 个交易。 做 for 循环,把 i 0 加到到 n-1, 设置 S[i+1] = APPLY(S[i],TX[i]) 如果任何一个应用(APPLY)返回错误,则退出并且返回。

    6. 返回 true,并且把 S[n] 设置成这个区块最末端的状态。

    有效创建一个区块的方法只有不断的尝试和出错。

    当攻击发生的时候,比特币底层加密技术是安全的,攻击者只能攻击没有加密的部分就是交易次序。
    1. 发送 100 BTC 到一个商人,以兑换一些商品 (最好是快速交易的数字商品)
    2. 等待商品的发货
    3. 创建另一个交易,发送同样的 100 BTC 给自己
    4. 尝试让网络相信他发给他自己的那个交易是最新出现的。
    一旦步骤 (1)发生, 几分钟后,一些矿工就会把这个交易打包进一个区块, 假设声明该区块编号是270000. 大约一个小时后, 在那个区块之后又会有新增的五个区块添加到区块链中, 这五个区块都间接的指向了那个交易270000,从而“确认”了那交易是真的。
    在这一刻,商家接收到了货款,并且发出了商品; 因为我们假设是一个数字商品,所以攻击者能立刻就收到货。
    现在攻击者创建另一个交易,向他自己的另一个账户发送这 100 BTC 。如果这个攻击者只是简单的释放了这个交易,那么这个交易将不会被执行; 矿工将会尝试运行状态转移函数 APPLY(S,TX) ,攻击者向自己发送的100个比特币的交易其实是不存在的,因此,这个攻击者创建了一个比特币区块链的“分支” 。开始挖取区块 270000的另一个版本,这个版本指向同样的区块 269999 作为一个父亲,但是用这新的交易替换了旧的(把发送给自己的交易替换了发送给商人的交易)。
    因为这区块的数据是不同的 , 这就需要为相关的区块重新做工作证明。 此外,这个攻击者的新的版本的区块 270000 有一个不同的哈希,所以这已存在的区块 270001270005 不会指向它; 因此, 这原来的链和这攻击者的新链是完全独立的。
    
    区块链的规则是:在分支中最长的区块链链将会变成真正的链,所以合法的矿工将会继续在 270005 这条链上工作,同时攻击者自己一个人单独的工作在新版本的 270000 这条链上。为了让攻击者他自己的区块成为最长,他需要的计算能力比其他网络的总和还要多(“51%攻击”)。比特币的区块依赖之前所有区块的哈希。一个拥有巨大计算能力的攻击者可以重新设计工作的证明(PoW),并最终获得大量的比特币。

    默克尔树:数据结构

    比特币的一个重要特性,这区块是存在一个多级数据结构中的 。一个区块的“哈希值”实际上只是这个区块的头信息的哈希值,一个大约 200 个字节的数据,其中包含了时间戳,随机数,上一个区块的哈希和一个存储了这个区块中所有交易的称之为默克尔树的数据结构的根哈希。 默克尔树是一种二叉树,包含了一组节点,它们的含有基础信息的树根有大量的叶子节点,一组中间节点,每一个节点都是它的 2 个子节点的哈希,然后,最终的一个根节点,也是由它的 2 个子节点的哈希形成,代表着这树的“顶端”。
    如果一个恶意的用户试图在默克尔树的底部替换一个假的交易, 这个更改将导致上面的节点发生变化,然后上面的节点的变化又会导致上上面的节点发生变化,最终改变这个数根节点,因此也改变了这区块的哈希,导致这个协议把它注册成一个完全不同的区块 (几乎可以肯定是一个无效的工作证明).
    这默克尔树协议对比特币的长期可持续发展是必不可少的。比特币网络中的一个“完整节点” , 截止到 2014 年,占用了大约 15G 的磁盘空间,并且每月正在以 10 亿字节的速度递增。这使得轻节点只要
    目前,这对于电脑来说是没有问题的,但是在手机上却是不现实的。在以后的将来,只有商业的和业余爱好者才参与玩比特币。
    山寨区块链应用;
    将底层的区块链理念应用到其他概念上的想法也有很长的历史了。在 2005 年, 尼克萨博提出了这个念 “用所有权保护产权(secure property titles with owner authority)”, 文档描述了“复制数据库的新技术”将如何使用一个基于区块链的系统来存储谁拥有土地的注册登记信息, 建立一个精心设计的框架,包括“宅地”,“逆权侵占”和 “地税”等概念。然而,不幸的是,那个时候没有一个有效的复制数据库信息,因此,协议从未付诸实践。然而,在 2009 年之后,比特币的去中心化的共识一被开发出来,许多山寨应用就迅速涌现出来。
    -------Namecoin – 创建于 2010 年,名字币是一个去中心化的名字注册数据库 。
    -------Colored coins – 彩色币的目的是为人们在比特币区块链上创建自己的数字货币,或者,其他一般意义上的货币 – 数字令牌提供服务。
    -------Metacoins – 元币的理念是在比特币区块链上创建新的协议,利用比特币的交易保存元币的交易,但是采用了不同的状态转换函数 APPLY’。
    以太坊:
    以太坊的目的是创建一种去中心化应用的协议,提供一套对大量的去中心化应用程序非常有用的新方案,特别强调快速开发,对小的和少数人使用的应用也非常安全(小而使用人少的应用容易被51%攻破),以及不同的应用程序之间能够有效的互动。
    
    以太坊是一系列协议,其核心就是一个以太坊虚拟机,能执行遵守协议的任何复杂的代
    码。以太坊虚拟机是图灵完备的,开发者可以在虚拟机上使用像 javascript,python 这样的友好的编程语言来创建应用。
    以太坊账户:
    以太坊的基本单元是账号。每一个账户都有一个 20 个字节长度的地址 。以太坊区块链跟踪每一个账号的状态,区块链上所有状态的转移都是账户之间的令牌(令牌即以太币)和信息的转移。以太坊有 2 种账户类型:外部账号,简称 EOA,是由私钥来控制的,合约帐户,由合约代码来控制,且只能由一个 EOA 账号来操作。
    
    当一个交易被发送到该账户时,合约中的代码就会被执行。用户可以通过把代码部署到区块链中来创建一个新合约,也即创建了一个新的合约账户。
    在以太坊中,全网的状态是由被“账户”的对象组成的,账户之间可以直接的进行价值和信息的转移,一个以太坊的账户包含下面 4 个字段:
    •  随机数, 一个计数器,用以确保每个交易都只会被处理一次
    •  账户当前的 以太币额度
    •  账户的 合约代码, 如果有的话
    •  这个账户的  存储 (默认空)
    消息和交易:
    名词“交易”在以太坊中是指签名的数据包,这个数据包中存储了从外部账户发送的消息,交易包含以下内容:
    •  消息的接收者
    •  一个可以识别发送者的签名
    •  发送方给接收方的以太币的数量
    •  一个可选的数据字段
    •  一个 STARTGAS 值, 表示执行这个交易允许消耗的最大计算步骤
    •  一个 GASPRICE 值, 表示发送方的每个计算步骤的费用
    前面三个是每一个加密货币都有的标准字段。默认情况下第四个数据字段没有任何功能,但是合约可以访问这里的数据;举个例子,如果一个合约是在一个区块链上提供域名注册服务的,那么它就会想把这数据字段中的数据解析成 2 个字段,第一个字段是域名,第二个字段是域名对应的 IP 地址。这个合约会从数据字段中读取这些值,然后适当把它们保存下来。
    这个 STARTGAS 和 GASPRICE 字段 是以太坊的预防拒绝式攻击用的,非常重要。为了防止在代码中出现意外或敌对的无限循环或其他计算浪费,每个交易都需要设置一个限制,以限制它的计算总步骤是一个明确的值。这计算的基本单位是“汽油(gas)”; 通常,一个计算成本是一个 1 滴汽油,但是一些操作需要消耗更多的汽油,因为它们的计算成本更高。在交易数据中每一个字节需要消耗 5 滴汽油。这样做的目的是为了让攻击者为他们所消耗的每一种资源,包括计算,带宽和存储支付费用;所以消耗网络资源越多,则交易成本就越大。
    消息:
    合约有能力向其他合约发生“消息”。消息是虚拟的对象,它从来不会被序列化,而且只存在于以太坊的执行环境中。一个消息包含以下内容:
    •  消息的发送者 (隐式)
    •  消息的接收者
    •  与消息一起传送的以太币的数量
    •  一个可选的数据字段
    •  一个 STARTGAS 值
    
    以太坊状态转移函数:

    处理交易之后状态就会变化。

    以太坊的区块链和比特币的区块链有很多相似的地方,也有很多不同的地方。这个以太坊和比特币在区块链体系中最重要的不同点是 :以太坊的区块同时包含了交易列表和最近区块的状态。除此之外,2 个其他的值,区块的编号和难度值也存在在区块中。以太坊中最基本的区块验证算法如下:
    1. 检查上一个区块是否存在和其有效性。
    2. 检测这区块的时间戳,是不是比上一个区块的大,并且小于 15 分钟
    3. 检查这区块编号,难度值,交易根(transaction root) , 叔根(uncle root)和汽油限制
    是否有效
    4. 检查这区块的工作证明是否有效
    5. 把 S[0] 设置成上一个区块的末端的状态
    6. 让 TX 成为这区块的交易列表,如果有 n 个交易。则做 for 循环 For i in 0...n-1, 设置
    S[i+1] = APPLY(S[i],TX[i]). 如果任何一个应用发生错误,或这区块中汽油的总的消耗达
    到了 GASLIMIT, 则返回一个错误.
    7. 让 S_FINAL 等于 S[n], 但是把支付给矿工的奖励添加到这区块里。
    8. 检查这个状态 S_FINAL 的默克尔树树根是不是和区块头信息中所提供的状态根是一样的。如果是,则区块有效,不然则无效。
    应用:
    一般来说,在以太坊上有三种类型的应用。第一种是金融应用,这包括 子货币,金融衍生品,套期保值合约,和一些雇佣合同等。第二类是半金融应用,这里有钱的存在但也有很重的非金钱的方面;最后,还有在线投票和去中心化治理这样的完全的非金融应用。
    当然除了金融外,任何情况下,只要对信用、安全、和持久有极高的要求,比如资产注册登记,投票,管理和物联网等都有可能受到以太坊平台的影响。
    参考资料:
    以太坊官网网站:https://ethereum.org/
    区块链信息查看:https://etherchain.org
    去中心化的应用:https://dapps.ethercasts.com/(以太坊的所有应用,就是web3.0,web3.0就是去中心化的应用,通过浏览器使用的,以太坊是一个平台,基于以太坊可以发布自己的应用)
    以太坊白皮书原文:https://github.com/ethereum/wiki/wiki/White-Paper

    一个比特币571美元。

  • 相关阅读:
    mysql 位操作支持
    统计代码行数
    git merge的参数--squash的用处
    bash和zsh切换
    nginx 添加https支持
    查看Memcache运行状况
    unkown host mac 解决
    react-redux中的重要API解析
    js 同步延时调用
    从输入 URL 到浏览器渲染完成
  • 原文地址:https://www.cnblogs.com/yaowen/p/9163621.html
Copyright © 2011-2022 走看看