blockchain
基于堆栈的语言,比如forth:
示例代码
以Forth为例,展示一个简单的加法操作:
1 | 3 4 + . |
上述代码的解释是:
- 将数字3推入堆栈。
- 将数字4推入堆栈。
- 执行加法操作,将堆栈顶部的两个数字相加,并将结果(7)推回堆栈。
.
操作符从堆栈中取出并打印结果。
图灵不完备
比特币交易脚本语言包含许多运算符,但在一个重要方面有意限制——它没有循环或复杂的流程控制能力,除了条件流程控制。这确保了该语言不是图灵完备的,也就是说,脚本具有有限的复杂性和可预测的执行时间。
图灵完备
图灵完备是指在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)按照一定的顺序,可以计算出结果
在给定无限内存的情况下,以太坊可以计算任何图灵机可以计算的算法。”
图灵完备带来运算方便性的同时,也带来安全和资源管理问题。“陷入死循环的打印机可以关闭并再次打开,但是这对于公共区块链却是不可能的”。ETH通过gas机制在保证图灵完备的的同时,限制了程序可以使用的资源量。
比特币中输入和输出的理解
比特币中输入和输出,其主语(对象)是一个交易(TX)
UTXO(Unspent Transaction Output,未花费交易输出)
每一笔TX都会消耗一个或多个UTXO,生成一个或多个UTXO
交易输入(input)引用之前交易的UTXO
交易输出(output)生成新的UTXO1
2
3
4
5
6
7
8
9
10
11
12
13以下展示TX示例
(1)A与B交易(忽略手续费)
输入:
引用了A持有的含有5个BTC的UTXO
输出:
2个BTC发给B(新UTXO,归B持有)
找零3个BTC(新UTXO,仍归A持有)
(2)合并UTXO操作(忽略手续费)
输入:
A的3个UTXO,分别含有0.5,1.5,3个BTC
输出:
一个含5个BTC的UTXO(归A持有)
《精通比特币 第三版》原文:
1 | 使用比特币的区块链存储与比特币支付无关的数据是一个颇具争议的议题。许多人认为这种使用是滥用的,希望予以遏制。而另一些人则将其视为区块链技术强大功能的展示,并希望鼓励这种实验。反对包含非支付数据的人士认为,这给运行完整比特币节点的人带来了负担,因为他们需要承担为区块链不打算承载的数据而进行的磁盘存储成本。此外,这样的交易可能会创建无法被花费的UTXO,使用传统比特币地址作为自由格式的20字节字段。由于该地址用于存储数据,它不对应于私钥,因此生成的UTXO永远无法被花费;这是一个虚假的支付。因此,永远无法被花费的这些交易从未从UTXO集中移除,并导致UTXO数据库的大小永远增加,或者说“膨胀”。 |
我的理解是,UTXO被花费并不能缓解数据膨胀,因为根据UTXO的特点,UTXO被花费后会生成一个或多个UTXO,UTXO数据库仍然是膨胀的。与原文想法相同的是,无法花费的“虚假”UTXO应被存储在区块链中而不是UTXO数据库中。
解决方式是引入OP_RETURN,OP_RETURN脚本没有对应的输入,因此无法用于花费
有效区块的特征
• 区块数据结构在语法上是有效的。
• 区块头哈希小于目标值(实施工作证明)。
• 区块时间戳位于 MTP 和未来两小时之间(允许时间误差)。
• 区块权重在可接受范围内。
• 第一个交易(仅第一个)是 coinbase 交易。
• 区块中的所有交易都使用“交易独立验证”部分讨论的交易清单进行验证。
区块确认时间为何是10分钟
- 若每个区块确认时间过短,会导致安全性降低:当区块生成时间缩短时,网络节点之间同步区块的时间变少,导致多个矿工可能同时挖出有效区块。这样会增加意外分叉的发生率,导致一些矿工的工作被浪费。
- 若每个区块确认时间过长:诚然,安全性会变高;但是会导致交易确认延迟,区块吞吐量下降等问题