比特币&以太坊

引言:比特币 and 以太坊

比特币

交易规则

交易

账户地址:160位的字符串,是公钥经过一些列Hash及Base58Check 编码运算生成的,一般还会加前导字节和4字节的校验字节

付款方和收款方均有一个账户地址

比特币中的奖励来源:

  • 挖矿奖励,每四年减半
  • 交易费用 Transaction Fee:输入与输出的差值

交易的金额有一定限制:

  • 交易中金额的最小单位是“”,即一亿分之一(10^-8)比特币
  • 目前规定每笔交易的交易费用不能小于 0.0001BTC

比特币的交易输入和输出:

  • UTXO(Unspent Transaction Outputs):未经使用的交易的输出
  • STXO(Spent Transaction Outputs):已经使用的交易的输出

在比特币中,一笔合法的交易输入必须是UTXO,并生成新的UTXO

一笔交易一般包括几个内容:

  • 付款人:账户地址、数字签名、UTXO的交易ID
  • 收款人:账户地址
  • 交易的金额、时间戳

比如:

交易号 交易 输入 输出 签名 奖励
T0 A转给B 他人转给A的输出 B可以使用这笔交易 A签名确认 输入与输出的差额
T1 B转给C T0的输出 C可以使用这笔交易 B签名确认 输入与输出的差额

注意:刚完成的交易并不能得到确认,需要等再生成几个区块才可以(防止该区块被推翻,一般是等待 6 个块,这需要大概一小时的时间(10min一个块))

网络中将会检查几个项目:

  • 交易是否已经处理过
  • 交易是否合法:地址是否合法、付款人是否拥有账户地址、是否是UTXO
  • 交易输入之和是否大于输出之和

检查通过后,将交易标记为合法的未确认消息,进行广播

如图所示:图来源,下文中若无标识,图片均来自此处

比特币交易例子

交易脚本

上一节的最后一个图,可以看到有InputScripts和OutputScript,这是交易脚本

交易脚本:用于检验交易是否合法,当所依附的交易发生时被触发

一般交易包括两个脚本:

  • 负责输入的解锁脚本 scriptSig:证明自己对某个交易的拥有权
  • 负责输出的锁定脚本 scriptPubKey:由付款方设置,比如设置为只有拥有此公钥才可以花费这比交易

输出脚本格式支持两种类型:P2PKH、P2SH,此处以前者为例

1
2
# 输出脚本
scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

输出脚本中:OP_DUP代表复制栈顶元素;OP_HASH160表示计算hash值;OP_EQUALVERIFY表示判断两者是否相等;OP_CHECKSIG表示判断签名是否合法;

组合起来的意思就是,复制栈顶元素并计算其hash后,与自己的公钥hash比较,判断是否相等,检查签名是否合法,如果合法代表此人可以花费这笔交易

1
2
# 输入脚本
scriptSig: <sig> <pubKey>

输入脚本中:用公钥对应的私钥对交易的Hash值进行签名

交易验证的完整指令如下,就是输入脚本+输出脚本:

1
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

将scriptSig、scriptPubKey依次放入栈中处理,此时栈顶就是pubkey,输出脚本将栈顶复制并求hash后于pubKeyHash比较是否相同,如果相同再比较签名(类似于Bob给Alice传递消息,需要传递消息本身+签名(hash后再加密))

挖矿

比特币中的奖励来源:

  • 挖矿奖励,每四年减半
  • 交易费用 Transaction Fee:输入与输出的差值

每个区块的奖励最初是 50 个比特币,每4年时间(每隔 21 万个区块),最终比特币总量稳定在 2100 万个,因此比特币不会通货膨胀

区块

一个Block包含多笔交易,不能超过1MB,主要包含:

  • Block大小:4Byte
  • Block head:80Byte
    • 版本号:4Byte
    • 上一个block的head的hash值:(对上一个头进行两次SHA256操作)32Byte
    • 时间戳:4Byte
    • 难度指标:4Byte
    • Nonce:4字节(PoW的答案)
  • 交易个数的计数:1-9Byte
  • 交易的具体内容(Merkle树存储)

Block的内容

挖矿过程(PoW机制)

比特币通过PoW机制来解决拜占庭问题

具体过程:参与者(矿工)去做系统给出的“题”,谁做出来,谁就有将所有新交易打包成新区块的权利。

题目是:矿工新打包的Block的hash值需要小于网络给定的一个值

(矿工根据上一个区块的hash值、新的验证过的交易内容、自己猜测的Nonce值生成一个新的区块,需要让新Block的hash值小于网络给定的一个值)

如何控制题目的难度?

系统每两周(2016个区块)根据上一周的挖矿时间来调整挖矿难度(据此估算出目前系统中拥有的算力大小)然后根据算力大小,设定SHA256的前缀0的个数(个数越多,难度呈指数型上升)将新Block的出现控制在10min左右

因为Hash几乎不可逆,所以矿工们只能一个一个尝试

细节部分查看Paper

缺陷:浪费了大量的算力、电力,而且系统的吞吐量很低,每秒只能处理7笔交易,实在是划不来

闪电网络

由于比特币的交易性能太差:每秒7笔交易,而且每笔交易的确认需要1h的等待

因此为了提高交易性能提出了新的设计

闪电网络:将大量的交易放到比特币区块链之外进行,只把关键环节放到链上进行确认

闪电网络引入了两个核心概念:(借鉴了智能合约的思想)

  • RSMC(Recoverable Sequence Maturity Contract 可撤销的顺序成熟度合约):解决链下交易的确认问题
  • HTLC(Hashed Timelock Contract 哈希的带时钟合约):解决支付通道问题

RSMC

R 可撤销 S顺序 M成熟度 C合约 :可撤销的顺序成熟度合约

解决链下交易的确认问题

原理:资金池机制

  1. 初始:双方预存资金到资金池(微支付通道)中,假设甲乙初始投入资金比2:1
  2. 发生交易A:
    1. 双方对交易A之后的分配结果进行确认,假如甲乙新的交易发生后变为7:2
    2. 签字作废旧的交易2:1
    3. 可能会重复1-2的过程
  3. 提现时:将双方签署过的交易7:2写入区块链中(只有提现才需要区块链

RSMC还有一些其他措施防止出错:

双方签名:这个过程可能会产生多笔合约,比如2:1 -> 7:2 -> 5:4,每一笔合约都需要双方签名。

罚没机制:如果甲方想要提现,但甲为了多拿点,就使用了7:2的合约,乙发现后,提供了最新的合约5:4,证明之前的合约已经作废,那么资金罚没给乙方(罚没机制确保了没人会故意拿一个旧的交易结果来提现)

先提后到:双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方

通过这样的机制就可以保证交易在链外完成,只把提现放在链上

HTLC

H 哈希 TL时钟 C合约:哈希的带时钟合约

解决支付通道问题

RSMC中的资金池(微支付通道)就是使用HTLC实现的,即限时转账

转账放冻结一笔钱并提供一个哈希值A,如果在一定时间内有人可以提出一个字符串,使得它的hash值B能与A匹配,则将钱转给对方

(如果陌生人猜到了这个哈希值也是可以拿这笔钱!)

侧链

侧链机制

侧链 Sidechain:允许资产在比特币区块链和其他区块链之间互转

出现的原因:以太坊等项目的竞争+山寨币的横行,比特币开发者希望拓展比特币的底层协议

侧链机制:以比特币区块链作为主链(Parent chain),其他区块链作为侧链,二者通过双向挂钩(Two-way peg),可实现比特币从主链转移到侧链进行流通

侧链

侧链的特点:

  • 可以是一个独立的区块链,可以有自己按需定制的账本、共识机制、交易类型、脚本和合约的支持等
  • 不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币
  • 当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链(如何实现?有多种方式,下面介绍SPV+双向挂钩

SPV证明

有时候用户只想知道交易是否合法(在区块链中且已被网络承认

SPV (Simplified Payment Verification)简单支付证明

能以较小的代价判断某个交易是否已经被验证过(存在于区块链中),以及得到了多少算力保护(定位包含该交易的区块在区块链中的位置)

SPV 客户端只需要下载所有区块的区块头(Block Header),并进行简单的定位和计算工作就可以给出验证结论

一个 SPV 证明包括两部分内容:

  • 一组区块头的列表,表示工作量证明
  • 一个特定输出确实存在于某个区块中的密码学证明

双向挂钩

如何确保发送资产的链上的币被可靠锁定?

SPV+双向挂钩

如图所示:

双相挂钩

整个过程类似于加锁、释放锁的过程:假设用户想要将一些比特币转移到侧链

  1. 在主链创建交易,等待网络确认
  2. 在侧链创建交易,获取比特币(指明是那一笔交易,且需要SPV证明)
  3. 等待一段竞争期,防止双花
  4. 比特币在侧链自由流通

流回主链的过程与上述过程相反

以太坊【未完成】

以太坊将比特币针对数字货币交易的功能拓展到复杂和灵活的应用场景

用户不再受限于仅能使用比特币脚本所支持的简单逻辑,而是可以自行设计任意复杂的合约逻辑(智能合约)

重要概念

智能合约

智能合约 Smart Contract:其本质是一个运行在以太坊虚拟机 EVM(Ethereum Virual Machine)中的应用

智能合约是对比特币上交易脚本的扩展,从一个简单交易的脚本拓展到了更加复杂的合约逻辑

EVM 以太坊虚拟机:是一个隔离的轻量级的虚拟机环境(无法访问本地网络、文件或是其他进程)一个智能合约往往在多个EVM中备份,其数据层是区块链

智能合约编写完毕后,用编译器编译为EVM专用的二进制格式,客户端上传该二进制到区块链中,运行在矿工的EVM上

简单理解:可以将只能合约理解为一个自动售卖机,需要支付以太币,然后换取想要的服务,比如金融、游戏等(用户输入参数,参数代入到智能合约,运行在矿工的EVM上,最后的结果存储在区块链中

账户

比特币中不存在账户的概念,而是通过UXTO与账户地址(一个160bit的串)进行交易记录,而以太坊有账户的概念

账户分为两种类型:

  • 合约账户(Contracts Accounts):存储智能合约的代码(代码控制的账户),只能被外部账户调用
  • 外部账户 EOA(Externally Owned Accounts):以太币拥有者账户,对应到某公钥

合约账户被调用时,存储其中的智能合约会在矿工处的虚拟机中自动执行,并消耗一定的燃料(燃料通过外部账户中的以太币进行购买)

账户有四个字段

  • nonce
    • 对于EOA:发送交易数量的计数器
    • 对于合约账户:合约数量
  • balance:ETH的账户余额
  • codeHash:无法更改
    • 对于EOA:空字符串的hash值
    • 对于合约账户:EVM上的账户代码
  • storageRoot:trie的根节点

以太币

以太币ETH 类似于比特币,是以太坊中的money

面额 ETH 值 常见用法
Wei 10^-18 技术实施
Gwei 10^-9 描述gas费用

1、以太币的总发行量:取决于验证者的数量和它们质押的以太币数量(区别与比特币的固定数量)

2、以太币可以铸造也可以销毁:铸造指产生新的ETH,奖励区块的提议者和验证者;每一笔交易都会发生以太币销毁(燃料)