比特币简介

  • 比特币是一个分布式的点对点网络系统
  • 比特币通过“挖矿”产生

    挖矿:验证比特币交易的同时参与竞赛来解决一个数学问题,全球化的算力竞争来取代对中央发行机构的需求

  • 比特币系统包含调节挖矿难度的协议。挖矿难度是动态调整的,保证不管有多少矿工(CPU)挖矿,平均每10分钟只有一个矿工成功。

  • 比特币协议还规定,每四年新币的开采量减半,同时限制比特币的最终开采总量为2,100万枚(2040年)。

简单交易流程

Alice向Bob支付0.05比特币买一杯咖啡..

  • Alice(的比特币钱包)从BlockChain中查询到自己还没有使用的比特币(UTXO)
  • Alice通过自己的私钥解锁该UTXO, 加上Bob的地址(公钥), 生成一笔新的交易
  • 把生成的这一笔交易广播给矿工节点(给矿工一丢丢手续费)
  • 矿工验证这一笔交易的正确的之后, 把交易写入区块链
  • Bob在区块链上验证了交易的正确性后(等待6个网络确认),认为这笔交易有效
  • Bob给Alice一杯咖啡,交易成功

交易(Transaction)

  1. 加密
  2. 签名
  3. 校验

非对称加密

椭圆曲线算法(ECC,ECDSA)

$$ y^2 mod p = (x^3 + 7) mod p $$ $$ p = 2^{256}–2^{32}–2^9–2^8–2^7–2^6–2^4–1 $$

给定素数p和椭圆曲线E G为指定基点

对 K=kG,已知k和G计算K比较容易,而由G和K计算k则比较困难

至今没有有效的方法来解决这个问题,这就是椭圆曲线算法原理之所在.

私钥k

  • \(1-2^{256}\)

私钥可以是1和n-1之间的任何数字,其中n是一个常数(\(n=1.158*10^{77}\),略小于\(2^{256}\)),由比特币所使用的椭圆曲线的阶所定义。 一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。 如果运算结果小于n-1,我们就有了一个合适的私钥。

公钥K

  • \(K = kG\)

加密过程:

  • 用户A选择一个私有密钥k,并生成公开密钥\(K = kG\)
  • 用户A将Ep和点K,G传给用户B
  • 用户B接到信息后,将待传输的明文编码到Ep上一点M,并产生一个随机整数r(r<n)
  • 用户B计算点\(C1=M+rK\)和\(C2=rG\)
  • 用户B将C1、C2传给用户A
  • 用户A接到信息后,计算\(C1-kC2=M\) 得到明文

签名过程:

  • 选择一条椭圆曲线Ep,和基点G
  • 选择私有密钥k(k<n),利用基点G计算公开密钥K=kG
  • 产生一个随机整数r(r<n),计算点R=rG
  • 将context和点R的坐标值x,y作为参数,计算Hash=SHA(context,x,y)
  • 计算\(sig=r-Hash*k(mod n)\)
  • 将sig和Hash作为context的签名

签名验证:

  • 从用户签名中,提取sig以及Hash
  • 如果sig Hash正确,可以计算点R(x,y)的坐标
  • 已知 \(sig=r-Hash*k \)
  • 计算 \( sig*G+Hash*K=R \)
  • 将context和点R的坐标值x,y作为参数,计算H=SHA(context,x,y)
  • 如果H=Hash 则成功.如果H≠Hash,则失败

椭圆曲线ECC加密算法与RSA加密算法的比较

  • 安全性能更高 如160位ECC与1024位RSA、DSA有相同的安全强度。
  • 计算量小,处理速度快 在私钥的处理速度上(解密和签名),ECC远 比RSA、DSA快得多。
  • 存储空间占用小 ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多, 所以占用的存储空间小得多。
  • 带宽要求低使得ECC具有广泛得应用前景。

公钥生成地址

靓号地址

生成 KidsCharity 开头的地址

交易结构

交易脚本

比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。

锁定脚本

  • 放在输出上的“障碍”,同时它明确了今后花费这笔输出的条件。
  • 通常包含一个公钥

解锁脚本

  • “解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。
  • 往往含有一个被用户的比特币钱包(通过用户的私钥)生成的数字签名

脚本是酱紫的

P2PKH(Pay-to-Public-Key-Hash)

比特币网络上的大多数交易都是P2PKH交易,此类交易都含有一个锁定脚本,该脚本由公钥哈希实现阻止输出功能

  • 锁定脚本

    OP_DUP OP_HASH160 (Cafe Public Key Hash) OP_EQUAL OP_CHECKSIG Cafe Public Key Hash即为咖啡馆的比特币地址Hash

  • 解锁脚本

    (Cafe Signature) (Cafe Public Key)

  • 将两个脚本结合起来可以形成如下有效组合脚本

    (Cafe Signature) (Cafe Public Key) OP_DUP OP_HASH160 (Cafe Public Key Hash) OP_EQUAL OP_CHECKSIG

P2PK(Pay-to-Public-Key)

与P2PKH相比,P2PK模式更为简单。公钥本身已经存储在锁定脚本中,而且代码长度也更短。P2PKH是由Satoshi创建的,主要目的一方面为使比特币地址更简短,另一方面也使之更方便使用。P2PK目前在Coinbase交易中最为常见,Coinbase交易由老的采矿软件产生,目前还没更新至P2PKH。

  • 锁定脚本

    (Public Key A) OP_CHECKSIG

  • 解锁脚本

    (Signature from Private Key A)

  • 将两个脚本结合起来可以形成如下有效组合脚本

    (Signature from Private Key A) (Public Key A) OP_CHECKSIG

多重签名

假如记录在脚本中的公钥个数为N,则至少需提供其中的M个公钥才可以解锁。这也被称为M-N组合,其中,N是记录在脚本中的公钥总个数,M是使得多重签名生效的公钥数阀值

  • 锁定脚本

    M (Public Key 1) (Public Key 2) ... (Public Key N) N OP_CHECKMULTISIG

  • 解锁脚本

    OP_0 (Signature B) (Signature C)

  • 将两个脚本结合起来可以形成如下有效组合脚本 M=2 N=3

    OP_0 (Signature B) (Signature C) 2 (Public Key A) (Public Key B) (Public Key C) 3 OP_CHECKMULTISIG

  • 验证未解锁脚本是否含有与3个公钥中的任意2个相一致的私钥的有效签名。

钱包

  • 储存私钥:

    • 种子钱包
    • 非确定钱包 (Just a Bunch Of Keys (JBOK))
    • 纸钱包 脑钱包 冷钱包 ...
  • 记录UTXO

  • 验证交易

简单支付验证(SPV)

SPV节点只需下载区块头,而不用下载包含在每个区块中的交易信息。由此产生的不含交易信息的区块链,大小只有完整区块链的1/1000。SPV节点不能构建所有可用于消费的UTXO的全貌,这是由于它们并不知道网络上所有交易的完整信息。SPV节点验证交易时所使用的方法略有不同,这个方法需依赖对等节点“按需”提供区块链相关部分的局部视图。

Bloom过滤器

  • 允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜索关键词的同时保护他们的隐私。
  • 在SPV节点里,这一方法被用来向对等节点发送交易信息查询请求,同时交易地址不会被暴露。
  • Bloom过滤器可以让SPV节点指定交易的搜索模式,该搜索模式可以基于准确性或私密性的考虑被调节。
  • 一个非常具体的Bloom过滤器会生成更准确的结果,但也会显示该用户钱包里的使用的地址;反之,如果过滤器只包含简单的关键词,更多相应的交易会被搜索出来,在包含若干无关交易的同时有着更高的私密性。

区块链(BlockChain)

  • 比特币网络
  • 矿工
  • 交易池
  • 区块链结构
  • 区块链分叉
  • 攻击
  • 侧链

比特币网络

新加入的节点

区块链(BlockChain)

区块结构:

区块头:

Merkle Tree

哈希二叉树,作快速归纳和校验大规模数据完整性的数据结构

  • 结构

快速验证交易

开始挖矿 第一步

整合交易池中的交易

比特币网络中几乎每个节点都会维护一份未确认交易的临时列表,被称为内存池或交易池

  • 交易独立校验
    • 交易字节
    • 输入输出
    • 锁定脚本符合标准
    • 解锁脚本验证正确
  • 交易块龄,矿工费和优先级

开始挖矿 第二步

CoinBase 和交易费

  • CoinBase 奖励
  • 交易费 Total Fees = Sum(Inputs) - Sum(Outputs)
  • 写入区块第一个交易

开始挖矿 第三步

构造区块头

  • 工作量证明算法(POW)
  • 不停地修改区块, 使其Hash满足条件(小于某个难度值)

根据节点算力的提升, 减小目标阀值, 使10分钟左右生成一个区块

New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)

  • 随机值升位

开始挖矿 第四步

广播区块链

  • 把满足条件的区块写入区块链
  • 广播给其他节点
  • 验证区块

区块链分叉

区块链分叉

区块链分叉

区块链分叉

攻击 51%

  • 一个算力大于51%的节点 产生一笔输出
  • 自己不承认这笔输出, 疯狂的自己计算区块写入区块链
  • 总有一个时间,这个节点的区块链长度会超过原来区块链

获利

其他意图

侧链

  • 为了扩充比特币的交易量

    当前,比特币网络只支持每秒约7笔交易,而Visa则每秒大约支持45000笔交易

  • 扩大区块? 侧链?

  • 切换自己的区块链节点(交易平台) 降低了去中心化