区块链基础知识

数据形式

  1. Cryptographic Hash Functions
    • 输入任意长数据,输出固定长hash,且计算容易
    • 安全性:
      • 防碰撞Collision Resistance:
        很难找到一堆x,y满足 $x \neq y$ and $H(x)=H(y)$
      • Second pre-image resistance(more constrained than collision resistance)
        对于x,很难找到一个y,满足:$x \neq y$ and $H(x) = H(y)$
      • Pre-image resistance
        对于任意h,在hash函数的输出中,很难找到对应的x,即 $H(x)=h$
      • Hiding
        当从高低熵概率分布中选择一个秘密值r,再有 $H(r||x)$ 的结果,我们很难找到对应的x,这样的情况下我们可以说hash函数H是hiding
        就是说,对密码加hash H和salt r,这样即使有人黑了数据库知道了加密后的密码,也无法倒推出我们的原来的密码
      • Puzzle-friendly
        对于一个输出n个字节h值的哈希函数H,如果选择一个k,那么他应该很难在$2^n$时间内找到一个x使得$H(k||x)=h$
        就是说最佳方法是brute force,使得挖矿变得可能
        A solution to the puzzle is a value x, s.t. $H(id||x) \in Y$
  2. Markle Tree
    • 比如有四组Transaction,Hash每个Transcation得到4个hash值,两两hash得到两个hash值,最后再hash一次,得到Merkle Root。
      • 如果有奇数的,则自己和自己组hash
    • 如果一个Transcation变动,那么Merkle root会变
    • 可以通过O(log(n))时间找到变动的地方
    • Simple Payment Verification目的是用户不需要下载所有交易部分,只需要有header就可以
    • 步骤如下,假设有Transcation T_k要验证
      1) H_k = Hash(T_k)
      2) 节点从区块链网络上获取最长链的Header
      3) 从区块链获取带验证支付对应的Merkle tree哈希认证路径
      4) 从认证路径,与H_k一起重新计算Hash
      5) 如果最后结果与Root相同则支付有效。
![](BlockChain-Background/MerkleTree.png)
要验证HK,则需要知道HL、HIJ、HMNOP 和 HABCDEFGH
  1. Elliptic Curve Signature Algorithm(ECDSA)
    • 用来对transaction签名
    • 验证Transaction的签名

地址

  • 唯一身份
  • 公钥的Hash
  • 0 < Balance < 21 Million Bitcoin
  • 1 Satoshi == $10^{-8}$ Bitcoin
  • 地址的第一位表示需要几个秘钥来

交易Transaction

当Alice将她拥有的一个比特币发送0.25个比特币给Bob时,0.25个BTC将会有一个新的地址,而Alice剩下的0.75个BTC的地址也会改变。

$\sum inputs \geq \sum outputs$ 大于等于是因为中间会收取一定的费用给矿工。

比特币脚本Scripts

  • Stack based programming language,即根据opcode,对stack顶的数据进行计算,这样增快了速度
  • 如果验证为真,则交易是正确的
  • 用许多操作码来减少时间,防止DoS攻击

Transcation的种类

  • P2PKH Pay to Public Key Hash如上图所示
  • P2SH Pay to Script Hash
  • Multisignature(m-n)

Block

由Header和List of transactions组成

Header以下这些组成

  1. 版本信息
  2. 上一个block的header的hash,
  3. merkle root
  4. Unix时间戳
  5. Target(代表挖矿的难度)
  6. Nonce

挖矿

如何挖矿

  1. 加入网络,监听交易,验证所有进来的交易tx,并收集成List of transcation
  2. 监听新的block,区块连会每隔多少时间自动生成一个新的区块
    其中包含前一个区块头的hash,交易的merkle root,和一个target
    这个target控制挖矿难度,每隔固定周期会调整target是他不会太难或太易
  3. 建立Block模版,即创建header
  4. 找到一个Nonce,使其满足条件
    Hash( Hash(prev_block_header) | txs | N ) < target,只能brute force
  5. 告诉其他的矿工 gossip P2P
  6. 接受奖励

因为现在很难靠自己一个人算出结果,所以大家一般都加入一个矿池,Pool Operator按每个人的算力贡献分配所得的。

Mining Difficulty in Pooling

Bitcoin Difficulty: Hash(Hash(B3) | txs | N) < Target = 0x000**

Pool Difficulty: Hash(Hash(B3) | txs | N) < target = 0x00**

把任务分配给每个矿工,每个矿工的t << T,难度远小于正常的T

Merge Mining

如果两种区块链都用了相同的PoW,那么弱的那方(因为参加挖矿的人数不多,所以target比较简单)很容易被大区块链中的矿工池所控制。

比如Namecoin是对Bitcoin添加了DNS的一个链,其本质算法与Bitcoin相同。那么Bitcoin的矿工计算得到一个随机数,如果随机数满足Namecoin的难度值(Namecoin的难度值一般情况肯定比bitcoin小,或者相等),Namecoin挖矿成功,打包交易成区块,然后上链;

如果随机数同时满足Bitcoin的难度值,bitcoin挖矿成功,打包交易上链(注意是bitcoin的区块链,bitcoin与namecoin拥有自己独立的区块链)。

好处:可以利用算力

缺点:

  • 方便了黑客
  • 弱方的链可能不会被validate

矿池的潜在危害

  • 可以决定那些transcation添加入blockchain
  • 可以影响transcation fee或者gas price
  • 可以相互协作达到51%攻击
  • 影响PoS的投票机制

所以要去中心化矿池
Bitcoin的方法:P2Pool,重新建一个share链,每个人算shared block,当算到正确解时,发钱。

Efficiency:A share is set to be found every 30 seconds. The more miners, the higher payout variance

Security: Many orphan shares (due to short block time) Small P2Pools have weak security. Need to incentivize block submission and validation

Ethereum的方法:SmartPool

Fork

Hard Fork

之前所有的不符合新标准的block都会合规,符合的变不合规。增加了functionality
所有的节点都需要升级到最新版本

Soft

只有之前合规的block变成不合规,减少了functionality
以前的block仍可以用。
比如进阶到了P2SH

Segregated Witness(Segwit)

把签名和脚本放到witness block中,链中只保存sender,reciver和value

好处:

  1. 可以扩容到4mb而不需要hard fork,
  2. 同时也解决了malleable的问题,
    即Bob可以改变上一个Alice与Bob的未提交的交易Tx,即改变其 signature,使得Tx不成立,那么Bob和Charlie之间的交易Tx+1,根据UTXO就会不成立,如果Charlie已经给Bob物品,那么就会有损失。

缺点:

  1. Signatures required to validate a block,
  2. Complex

用户分类

  • Full Node保存了所有的记录的节点
  • Miner矿工
  • Light Node用户
    • 因为不全,所以使用SPV
    • 小,可以PoW,可以跟全连。