记账技术历史悠久,现代复式记账系统(DoubleEntryBookkeeping)是由意大利数学家卢卡·帕西奥利,年在《Summadearithmetica,geometrica,proportionietproportionalità》一书中最早制定。复式记账法的基石是资产负债表等式,又称为会计恒等式。
即任何一项经济业务的发生,都会引起资产和负债的至少两个项目发生增减变动,而且增减的金额相等
复式记账法对每一笔账目同时记录来源和去向,首次将对账验证功能引入记账过程,提升了记账的可靠性。
从这个角度来看,区块链是首个自带对账功能的数字记账技术实现:在所有的交易都是通过一种有序的数据「块」进行登记,这个记录就被成为区块链。区块链是一个公共的分布式总账!更确切的说应该叫分布式的冗余的链式总帐本方案。
包含一个分布式数据库分布式数据库是区块链的物理载体,区块链是交易的逻辑载体,所有核心节点都应包含该条区块链数据的全副本区块链按时间序列化区块,且区块链是整个网络交易数据的唯一主体区块链只对添加有效,对其他操作无效基于非对称加密的公私钥验证记账节点要求拜占庭将*问题可解/避免共识过程(consensusprogress)是演化稳定的,即面对一定量的不同节点的矛盾数据不会崩溃。共识过程能够解决double-spending问题
比特币使用UXTO模型,以太坊和比特股使用账户余额模型(所谓账户模型是指账户记账方法)。
UXTO模型(UnspentTransactionOutputs(UTXOs)):此模型表达了一种转移的概念,即任何产生的新币,在以后的生命周期中,只有转移,没有消亡,转移实质上是由加密算法的签名与验证控制的:
账户余额模型:账户余额模型摒弃了这种强验证的账户模型,即账户余额回归到数字加减,这样做提升了交易的效率。
区块链的定义:
区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。它可以被存储为flatfile(一种包含没有相对关系记录的文件),或是存储在一个简单数据库中。
区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。区块链经常被视为一个垂直的栈,第一个区块作为栈底的首区块,随后每个区块都被放置在其他区块之上。用栈来形象化表示区块依次堆叠这一概念后,我们便可以使用一些术语,例如:“高度”来表示区块与首区块之间的距离;以及“顶部”或“顶端”来表示最新添加的区块。
对每个区块头进行SHA加密哈希,可生成一个哈希值。通过这个哈希值,可以识别出区块链中的对应区块。同时,每一个区块都可以通过其区块头的“父区块哈希值”字段引用前一区块(父区块)。也就是说,每个区块头都包含它的父区块哈希值。这样把每个区块链接到各自父区块的哈希值序列就创建了一条一直可以追溯到第一个区块(创世区块)的链条。
虽然每个区块只有一个父区块,但可以暂时拥有多个子区块。每个子区块都将同一区块作为其父区块,并且在“父区块哈希值”字段中具有相同的(父区块)哈希值。一个区块出现多个子区块的情况被称为“区块链分叉”。区块链分叉只是暂时状态,只有当多个不同区块几乎同时被不同的矿工发现时才会发生(参见“8.10.1区块链分叉”)。最终,只有一个子区块会成为区块链的一部分,同时解决了“区块链分叉”的问题。尽管一个区块可能会有不止一个子区块,但每一区块只有一个父区块,这是因为一个区块只有一个“父区块哈希值”字段可以指向它的唯一父区块。
由于区块头里面包含“父区块哈希值”字段,所以当前区块的哈希值因此也受到该字段的影响。如果父区块的身份标识发生变化,子区块的身份标识也会跟着变化。当父区块有任何改动时,父区块的哈希值也发生变化。父区块的哈希值发生改变将迫使子区块的“父区块哈希值”字段发生改变,从而又将导致子区块的哈希值发生改变。而子区块的哈希值发生改变又将迫使孙区块的“父区块哈希值”字段发生改变,又因此改变了孙区块哈希值,等等以此类推。一旦一个区块有很多代以后,这种瀑布效应将保证该区块不会被改变,除非强制重新计算该区块所有后续的区块。正是因为这样的重新计算需要耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变,这也是比特币安全性的一个关键特征。
你可以把区块链想象成地质构造中的地质层或者是冰川岩芯样品。表层可能会随着季节而变化,甚至在沉积之前就被风吹走了。但是越往深处,地质层就变得越稳定。到了几百英尺深的地方,你看到的将是保存了数百万年但依然保持历史原状的岩层。在区块链里,最近的几个区块可能会由于区块链分叉所引发的重新计算而被修改。最新的六个区块就像几英寸深的表土层。但是,超过这六块后,区块在区块链中的位置越深,被改变的可能性就越小。在个区块以后,区块链已经足够稳定,这时Coinbase交易(包含新挖出的比特币的交易)可以被支付。几千个区块(一个月)后的区块链将变成确定的历史,永远不会改变。
区块链解决了啥问题?
根本还是解决买卖间彼此不信任的问题,在不依赖传统机构建立信任的情况下,成功完成一笔安全交易。
能够提供一个可信任的环境,使
每个节点交换数据过程不被篡改;交换历史记录不可被篡改;每个节点的数据会同步到最新数据,且承认经过共识的最新数据;基于少数服从多数的原则,整体节点维护的数据本身客观反映了交换历史。拜占庭将*问题延伸到互联网生活中来,其内涵可概括为:在互联网大背景下,当需要与不熟悉的对手方进行价值交换活动时,人们如何才能防止不会被其中的恶意破坏者欺骗、迷惑从而做出错误的决策。进一步将拜占庭将*问题延伸到技术领域中来,其内涵可概括为:在缺少可信任的中央节点和可信任的通道的情况下,分布在网络中的各个节点应如何达成共识。区块链技术解决了闻名已久的拜占庭将*问题——它提供了一种无需信任单个节点、还能创建共识网络的方法。
维护一条不断增长的链,只可能添加记录,而发生过的记录都不可篡改;通过密码学的机制来确保交易无法抵赖和破坏,并尽量保护用户信息和记录的隐私性所有的结点都有能力去用计算能力投票,从而保证了得到承认的结果是大多数人公认的结果,不会因为少数结点作恶,而修改结果区块链的核心技术理论是啥?
去中心化,或者说多中心化,无需集中的控制而能达成共识,实现上尽量分布式。
从这个角度上看,区块链对于人类社会的意义在于,信任重新构建,而不依赖于中央银行、企业
区块链的优势在于能够用非常低的成本解决网络交易的身份识别和个人征信,以及使用点对点的交易避免了传统集中式的清算结构,从而能够大大提高金融系统甚至整个经济体系的运行效率
记账货币可以记载账务、价格以及一般购买力,是货币理论最基本的概念。从严格意义上说,货币只有在于记账货币的关系中才能存在。——凯恩斯
比特币只是记账的表征,而区块链就是其背后的一套由信用记录以及信用记录的清算构成的体系。
信任,其实就是彼此相信对方不会做出伤害到我的欺诈和违约行为。信任的产生包含三个层面,一是对方没有欺诈的动机;二是对方有欺诈的动机却不敢或者不愿意真的去行动;三是对方不仅有动机,还真的去做出了欺诈行为,但由于各种原因,不会对我做出伤害。区块链机制这个基础协议便通过分布式的信用公正,使互不信任的节点进行大规模协作成为可能,这可以激发共享经济和协同治理的巨大潜能。在这样一个去中心化的经济系统内部,在没有任何可信第三方担保的情况下,却没有发生过严重的欺诈行为,其主要原因在于,欺诈行为的成本往往远大于预期的收益。
显然,当欺诈的行为所要付出的成本远大于其所能带来的收益时,并且成本和收益都经过了精确的计算时,任何一个理性的参与者都不会有欺诈的动力。
以区块链为基础,人们正在互联网上建立起一套信用互联网治理机制。包括:
工作量证明(如果要篡改区块链上的数据,需要拥有全网51%的算力,这会使得作伪的成本高于预期利益)互联网共识机制(无需甄别好坏,以共识来确保正确)智能合约机制(以可以编译的程序代替合同,网络自动执行合约)互联网透明机制(账号全网公开而账户匿名)密码学,非对称加密和公私钥等技术等区块链技术涉及的关键点包括:去中心化(Decentralized)、去信任(Trustless)、集体维护(Collectivelymaintain)、可靠数据库(ReliableDatabase)、时间戳(Timestamp)、非对称加密(AsymmetricCryptography)等。
区块链最大特点是啥?
区块链是将所有数据都存储在每一个节点存储。每个节点的数据一致性,区块链是一个开放的数据库,任何服务器都可以加入区块链,并成为其中的一个节点,每个节点都保存着区块链的全部数据,而且是相同的
如何保证全网交易数据客观记录并且不可篡改
,比特币使用工作量证明PoW(ProofofWork),以太坊即将转换为权益证明PoS(ProofofStake),比特股使用授权权益证明DPoS(DelegatedProofofStake)。
以上这些算法我称之为“经济学”的算法,所谓经济学的算法,是指让作弊成本可计算,且让作弊成本往往远大于作弊带来的收益,即作弊无利可图,通过这种思想构造一个用于节点之间博弈的算法,并使之趋向一个稳定的平衡。
相对应的我们还有计算机领域的分布式一致性算法,例如Paxos、Raft,我也称之为传统分布式一致性算法。他们之间的最大区别是:
系统在拜占庭将*(ByzantineGeneralsProblem)情景下的可靠性,即拜占庭容错(PBFT算法支持拜占庭容错)。然而无论是Paxos还是Raft算法,理论上都可能会进入无法表决通过的死循环(尽管这个概率其实是非常非常低的),但是他们都是满足safety的,只是放松了liveness的要求,PBFT也是这样。
下面是一些传统分布式一致性算法和区块链共识过程的异同点:
相同点:
Appendonly强调序列化少数服从多数原则分离覆盖的问题:即长链覆盖短链区块,多节点覆盖少数节点日志不同点:
传统分布式一致性算法大多不考虑拜占庭容错(ByzanetinePaxos除外),即假设所有节点只发生宕机、网络故障等非人为问题,并不考虑恶意节点篡改数据的问题;传统分布式一致性算法是面向日志(数据库)的,即更通用的情况,而区块链共识模型面向交易的,所以严格来说,传统分布式一致性算法应该处于区块链共识模型的下面一层。如何确保每个节点数据一致的呢?
每个区块就是一个哈希值,哈希就是一串字母加数字,可以表示任何的事情。每个区块链都需要记录上一个区块链、生成时间、以及本区块链的一些信息。一旦一个区块链被修改了,那么它自己的哈希值就变了,因为下一个区块需要记录上个区块的哈希值,所以下一个区块的哈希也需要变化,依次类推,也就是一个区块链变了,全网都需要同步。所以每个节点都保存着完整的区块链,所以做到了节点间的一致性。
基本原理
区块链的基本原理理解起来并不难。基本概念包括:
交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;
每一位电子货币所有者通过对前一次交易和货币接受者的公钥(pubilckey)签署一个hash数字签名,然后发送给下一位所有者。(1)收款人使用付款人的公钥(publickey)校验,是否是正确的付款人发送(2)由于交易中有收款人的公钥,所以只有收款人使用自己的私钥才能解锁并将该货币传递下去
但以上过程仍然有问题,无法解决双重支付问题,即货币所有者将同一电子货币签名后发送给多个收款人。传统金融:通过中介机构判断并确认用户是否进行双重支付比特币:通过公开宣布货币的所有交易,形成唯一公认的历史交易序列,由系统内所有参与者认同交易个人点评:通过非对称加密的公私钥,可以解决虚拟货币的归属权问题,但是同一个货币可以由归属人付给多个人,也就是双重支付,仅使用加密在货币体系里是不够的。(这里其实隐含了货币体系必须要有人记账)
时间戳服务器(Timestampserver)。对区块形式存在的一组数据实施随机散列(HASH)加上时间戳,将区块连成一个链条,形成区块链
工作量证明(Proof-of-Work)计算一个随机数(Nonce),将随机数与区块头一起计算随机散列值(Hash),该散列值要满足以N个0开头(N为变量,可通过N来控制计算难度,N越大,难度越大),此即为“挖矿”的内部原理。
工作量证明的用途:(1)保证区块链(Blockchain)的不可篡改性,由于区块形成了链条,如果要修改区块,必须重新完成之前所有的工作量,所以随着区块链高度越高,越旧的区块越难以篡改。(2)工作量证明的本质是一CPU一票(与传统的一IP一票不同,攻击者要获得更多的票数需要投入大量的成本),如果大多数的CPU为诚实节点,那么正确的链条将以最快的速度延长。
模型能保证账本的顺序和真实性,但是无法阻止人为的创造多个账本,而这些账本中只能有一个是被大家认可的,所以必须创造一种共识机制。比特币的共识机制即为工作量证明(POW),即工作量(Hash计算)最大的那个账本是大家公认的正确账本。
区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识
链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。
区块链架构层面
一个区块链至少分为三层
最底层是一些通用的基础模块,比如基础加密算法,网络通讯库,流处理,线程封装,消息封装与解码,系统时间等中间一层是区块链的核心模块,一般包含了区块链的主要逻辑,如P2P网络协议,共识模块,交易处理模块,交易池模块,简单合约或者智能合约模块,嵌入式数据库处理模块,钱包模块等等最上面一层,往往都是基于JsonStandardRPC的交互模块,基于Json-RPC,我们还可以做出更好的UI界面,也可以是一个web-service。如果区块链支持智能合约,可能还要分更多的层,比如增加BaaS层,区块链上的智能合约提供自治的服务
以上无论哪种设计,一般都要从P2P网络协议作为切入,作为一个P2P钱包,既要提供Service也要提供Client,作为Service依赖P2P网络协议,作为Client依赖Json-RPC。
编程实现
比特币(协议层)就是用C++语言开发的,而且目前为止,没有比比特币更加成功的区块链产品。比特币官方客户端钱包用的Qt,第三方钱包有Python语言开发的,特别是第三方整理的开发库(Api包)很多是Nodejs设计的
C/C++:github.