8.BTC-脚本

比特币的脚本语言,通常直接称为 Script,是比特币协议的核心组成部分之一。它是一种有意设计得非常简单、功能受限的编程语言,主要负责处理交易的验证和授权。 1. 基于堆栈(Stack-based):Script 语言没有变量。所有的操作都是通过一个“堆栈”来完成的。数据被推入(push)堆栈顶部,操作码(Opcodes)会处理堆栈顶部的一个或多个元素,然后将结果推回堆栈。 * 可以把它想象成一摞盘子:你只能在最上面放盘子(push),也只能从最上面拿盘子(pop)进行操作。 2. 逆波兰表示法(Reverse Polish Notation, RPN):指令(操作码)跟在数据后面。例如,要计算 2 + 3,在 Script 中会写成 2 3 OP_ADD。计算机会先将 2…

7.BTC-挖矿

挖矿过程的转变 第一阶段:CPU挖矿时代(2009年 - 2010年中) * 技术与工具:在这个阶段,矿工就是比特币的创造者中本聪和一小撮早期的密码学爱好者。他们使用的工具就是我们日常使用的个人电脑的中央处理器(CPU)。中本聪发布的第一个比特币客户端就内置了CPU挖矿的功能。 * 算力规模:极低。刚开始只有中本聪一台电脑在挖,算力仅为几 KH/s(每秒千次哈希)。随着更多爱好者加入,逐渐增长到 MH/s(每秒百万次哈希)级别。 * 时代特征: * 高度去中心化:任何拥有普通电脑的人都可以下载软件,点击“开始挖矿”,并有实际的机会挖到区块。 * 公平的起点:这是一个充满理想主义色彩的时期,参与者主要是出于对技术的兴趣和支持。 * 终结:2010年,开发者们发现,用计算机的显卡来挖矿,效率远高于CPU。CPU挖矿的时代就此迅速走向终结。 第二阶段:GPU挖矿时代(2010年中 - 2012年) * 技术与工具:开发者发现,用于处理图形和复杂数学运算的图形处理器(GPU,即显卡)…

6.BTC-挖矿难度

难度调整这个过程是完全自动的,被硬编码在比特币协议中,由网络中的每一个全节点独立计算和强制执行。 * 调整周期:每挖出 2016 个区块,网络就会进行一次难度调整。 * 目标时间:协议设定的目标是,挖出2016个区块应该花费的时间是: 2016 个区块 * 10 分钟/区块 = 20160 分钟 (也就是整整两周) * 调整逻辑:在每个调整点(比如第2016、4032、6048...个区块高度),所有节点都会执行以下计算: 1. 回顾并计算挖完过去这2016个区块,实际花费了多少时间(Actual_Time)。 2. 将这个实际时间与目标时间(20160分钟)进行比较。 3. 如果 Actual_Time < 20160 分钟:这说明过去的周期里,全网的平均算力增强了,导致出块速度快于10分钟。为了让出块速度慢下来,就必须增加挖矿难度。 4. 如果 Actual_…

5.BTC-网络

简单,鲁棒而不是高效 总体协议 BTC在应用层以Bitcion Block Chain为总和,运行着一个Bitcoin P2P Protocol。在网络层上,节点之间使用TCP通讯,整体上是一个P2P Overlay Network。 具体上,应用层规定了一系列命令和消息,例如: * version / verack:当两个节点初次建立连接时,它们会交换 version 消息来介绍自己(比如软件版本、区块高度等),然后用 verack 消息来确认连接成功。这是“握手”过程。 * getaddr / addr:节点可以用 getaddr 向对方请求已知的其他活跃节点地址列表,对方则用 addr 消息回复。这是节点发现和网络拓扑维护的关键。 * inv (Inventory):当一个节点有新的交易或区块时,它不会直接发送完整数据,而是先发送一个 inv 消息,告诉对方它拥有哪些新东西的“清单”(用哈希值表示)…

4.BTC-具体实现

基于交易的账本(Transaction-based Ledger) BTC使用UTXO模型 (Unspent Transaction Output Model - 未花费的交易输出模型),简单来说,比特币的账本不记录任何人的“账户余额”。相反,它记录一笔笔不可更改的交易历史。每个账户余额并不被记录在某个地方,而是分散在整个区块链历史中的、指向你的、尚未被花费的“数字支票”。 在一个转账交易中,可能存在多个输出。一个UTXO的结构非常简洁,它主要包含两个关键部分: 1. 金额 (Value / Amount) 这部分指定了这张“数字支票”的面值是多少。 * 单位:这个值通常用比特币的最小单位“聪” (Satoshi) 来记录。1个比特币等于1亿(10^8)聪。 * 作用:明确定义了这个UTXO所代表的、可以被未来交易花费的比特币数量。 2. 锁定脚本 (Locking Script / scriptPubKey) 这是UTXO中最核心部分。它不是一个简单的“…

3.BTC-协议

双重支付问题 (Double-Spending Problem) BTC中的公私钥解决了证明所有权和授权交易两个部分。私钥是你对某个地址下数字资产的唯一所有权证明,而数字签名是对一笔交易的、不可否认的授权。这套体系保证了只有你才能动用你的钱,别人伪造不了你的签名。但它只解决了“这笔交易是不是你本人同意的”这个问题。 数字世界和物理世界的根本区别在于可复制性。我有一个代表“1个币”的数字文件。我可以把它复制一百万份,每一份都和原始文件一模一样。那么一个只有公私钥的系统就会面临以下的问题: 1. 我拥有一个“币”,我的私钥能证明我拥有它。 2. 我创建了一笔交易:“我将这个币支付给商家A”。我用我的私钥对这笔交易进行了签名。商家A收到了这笔交易,验证了我的签名,确认有效。 3. 问题来了:在把交易发给A的同时(或者之后),我完全可以把**原始的那个“币”**再用一次,创建第二笔交易:“我将这个币支付给商家B”。我同样用我的私钥签名,商家B验证后也发现签名有效。 A和B都收到了一个密码学上完全有效的“支付凭证”。他们都认为自己收到了那个币。这个币到底属于谁?系统里并没有一个公认…

2.BTC-数据结构

哈希指针(Hash Pointer) * 哈希指针不仅存储了数据的内存地址,还额外存储了那块数据内容的加密哈希值。 * 组成:一个哈希指针包含两个部分: * 指针 (Pointer):指向数据的存储位置。 * 哈希 (Hash):指向的数据内容的哈希值。 区块链是一连串的哈希指针配合组成的: * 我们有一个数据块 Block 1。 * 我们创建一个指向 Block 1 的哈希指针 HP_1。这个指针里包含了 Block 1 的地址和 Hash(Block 1)。 * 现在,我们创建第二个数据块 Block 2。我们将哈希指针 HP_1 存放在 Block 2 的内部。 * 接着,我们再创建一个指向 Block 2 的哈希指针 HP_2,它包含 Block…

1.BTC-密码学原理

BTC中用到了密码学中的两个原理,哈希和签名 哈希(Hash) 加密哈希函数 (Cryptographic Hash Function) 将任意长度的数据(如文本、文件或密码)转换为一个固定长度的、独一无二的字符串。这个输出的字符串被称为哈希值 (Hash Value) 或消息摘要 (Message Digest)。用来检测信息是否被篡改。 加密哈希函数的性质: 1. 抗碰撞性 (Collision Resistance)/抗第二原像攻击 (Second Pre-image Resistance) 抗碰撞性的意思是找到两个不同的输入数据,使得它们能够产生相同的哈希值,在计算上是不可行的。即难以找到任意两个不同的输入 x 和 y,使得 Hash(x) = Hash(y)。这里不是指找不到这种输入数据,而是在人力的计算条件下不可行。 注意:目前没有任何一种哈希函数经过了数学证明这个形式,在实用中往往都是经验得出。 2. 抗原像攻击 (Pre-image Resistance)…