S. Nakamoto, “Bitcoin: A peer-to-peer electronic cash system”. https://bitcoin.org/bitcoin.pdf,2008.
本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。
传统支付系统:
区块链支付系统:
区块链是一个分布式账本,一种通过去中心化、去信任的方式集体维护一个可靠数据库的技术方案。
区块结构:
4字节 |
区块大小 |
描述该字段之后的区块大小 |
80字节 |
区块头 |
组成区块头的几个字段 |
1-9 |
交易计数器 |
记录交易的数量 |
可变 |
交易 |
记录在区块里的交易信息 |
区块头结构:
4字节 |
版本 |
版本号,用于跟踪软件/协议的更新 |
32字节 |
父区块哈希值 |
引用区块链中父区块的哈希值 |
32字节 |
Merkle根 |
该区块中交易的Merkle树根的哈希值 |
4字节 |
时间戳 |
该区块产生的近似时间 |
4字节 |
难度目标 |
该区块工作量证明算法的难度目标(控制10min) |
4字节 |
Nonce |
用于工作量证明算法的计数器 |
电子货币:一串链式的数字签名
收款人可通过检验签名去验证其所有者的链式关系
收款人不能确定“双花问题”(double-spend)?
传统支付系统:可信第三方解决“双花问题”
区块链支付系统:所有交易信息公开宣布,然后给交易信息加上时间戳,以确保大多数节点都认同该交易是首次出现。
时间戳服务器:证明数据在某特定时间是存在的
时间戳是一种具有法律效力的电子凭证
时间戳服务器将前一个时间戳与此时以区块形式存在的一组数据实施随机散列而加上时间戳,逐步增强而形成时间上的链条。
但攻击者可以修改区块中的信息然后重新做hash运算?
区块链用工作量证明解决这个问题
不断寻找一个随机值(nonce),使得该区块的随机散列(SHA-256)值满足一定的条件(如前面出现多少个0)。
不可篡改:(>50% CPU power)
若要修改该区块中的信息:要重新完成该区块及其后所有区块的工作量证明
经证明,一个较慢的攻击者试图赶上随后的区块,其成功概率将呈指数化递减
网络的运行步骤:
1、产生新的交易并广播至所有节点
2、节点收集新的交易封装成一个区块
3、节点在自己的区块上不断尝试找到满足条件的随机值完成工作量证明
4、当某个节点完成POW就将其产生的区块广播给其他节点
5、节点收到区块,验证其是否满足POW及区块中交易是否有效
6、若区块满足条件,节点会接受该区块,并在其后产生新的区块
任何机器都可以运行一个完整的比特币节点,一个完整的比特币节点包括如下功能:
区块头大小为80字节,一年产生的区块大约为4.2MB
用户不需要拥有完整的网络节点,只需要保留最长的工作量证明链条的区块头的拷贝即可。它可以不断向网络发起询问,直到他确信自己拥有最长的链条,并通过Merkle Tree 的分支找到某次交易。
区块链模型保护隐私:
无官方组织及管理机构,无中心服务器,参与的节点按照系统规则自由接入网络、不受控制,节点间基于共识机制开展工作。全世界任何人都可读取、任何人都能发送交易且交易能获得有效确认、任何人都能参与其中的共识过程,通常被认为是“完全去中心化”的。
私有链
建立在某个企业内部,系统的运作规则根据企业要求进行设定,修改甚至是读取权限仅限于少数节点,同时仍保留着区块链的真实性和部分去中心化的特性。其写入权限仅在一个组织手里,读取权限或者对外开放,或者被任意程度地进行了限制。相关的应用囊括数据库管理、审计、甚至一个公司。
联盟链
由若干机构联合发起,介于公有链和私有链之间,兼具部分去中心化的特性,其共识过程受到预选节点的控制。例如有15个金融机构组成的共同体,每个机构都运行着一个节点,而且为了使每个区块生效需要获得其中10个机构的确认(2/3确认)。区块链或许允许每个人都可读取,或者只受限于参与者,或走混合型路线,例如区块的根哈希及其API(应用程序接口)对外公开,API可允许外界用来作有限次数的查询和获取区块链状态的信息。这些区块链可视为“部分去中心化”。
“拜占庭将军问题”:
在一个不可靠、具有潜在威胁的网络中通过信息交流来达成一个行动协议共识。(POW、POS、DPOS...)
bitcoin客户端:
完整客户端:存储所有交易历史,管理用户钱包,不依赖第三方
轻量级客户端:不保存所有交易的完整历史,管理用户钱包,依赖第三方钱包(轻量级节点:SPV节点 SPV:简单支付验证)
在线客户端
钱包、地址、比特币、公司钥:
wallet = file
一个钱包包含多个比特币地址
An address has its own balance of bitcoins.
(address,sk)=(账号,密码)
sk通过椭圆曲线相乘等方式产生pk, pk通过hash可以产生地址
Combining and Splitting Value: