主页 > 最新imtoken官网下载链接 > 区块链学习笔记【持续更新中】

区块链学习笔记【持续更新中】

最新imtoken官网下载链接 2023-05-02 05:20:22

比特币交易流程简述

场景:地址A支付一个比特币给地址B

交易记录如下:

{
"付款地址":"A"
"收款地址":"B"
"金额":"1btc"
}

1.哈希和签名

首先,本地节点系统对交易进行Hash计算,根据交易记录(即交易的摘要信息)获取Hash值,然后使用私钥(生成比特币账户时获取)对交易进行签名交易摘要获取签名信息。

过程如下:

Sign( "私钥", 
    Hash({ "付款地址":"A",
            "收款地址":"B",
            "金额":"1btc"
         }));  -> "签名信息"

2.广播

接下来,向全网广播签名信息,让其他节点确认交易(广播过程实际上是向其他相邻节点发送信息,其他节点验证通过后将信息转发给相邻节点。扩散过程,类似于水滴在水面上荡漾的过程)

※问:为什么要用这个设计?

3.验证

当网络上的其他节点收到广播时,首先判断支付地址的余额是否足以支付这笔交易,然后通过“签名信息”和“支付地址”这两个参数计算出Hash值交易记录。 对原始交易记录进行Hash计算,然后将得到的两个Hash值进行比较,如果一致则验证成功,然后将这笔交易记录在账本数据中。 当一个节点记录成功时,它会发送广播通知全网节点。

过程如下:

            if(checkBalance()){
                if(Hash("签名信息","付款地址")
                     == Hash({ "付款地址" : "A", 
                        "收款地址" : "B",
                        "金额" : "1btc"
                        }) 
                    ){
                        // 计入账本数据
                        ...
                } else {
                    ...
                }
            }

补充:比特币系统采用椭圆曲线签名算法。 该算法的私钥由32字节的随机数组成。 公钥可以通过私钥计算出来。 公钥可以通过哈希计算和编码得到比特币地址。 地址可以看作是公钥的摘要。

簿记原则

记账就是挖矿。 比特币系统在产生下一个区块时,会使用Hash算法,将前一个区块的Hash值、序列号、时间戳、随机数、Merkle根等生成一个Hash值,然后将这个Hash值进行存储在生成的新块中作为新块的属性。 当下一个区块产生时,它会继续以这个区块的Hash值作为参数计算下一个Hash值。 这样做的好处是它是防篡改的。 因为每个区块的哈希值都与前一个区块相关联,如果某个区块的数据发生变化,就会导致哈希值不一致,从而被区块链系统发现。

随机数的作用

增加记账难度。

在比特币系统设计中,在记账过程中对前一个区块进行Hashing时,必须使用随机数作为计算的参数,使得最终的Hash结果是在原来的Hash值前加上18个0。

示例:如果哈希值是“12345”,没有随机数作为参数,那么在添加随机数作为参数后,哈希值必须符合格式“000000..012345”。

补充:挖矿一词是因为随机数的加入大大增加了计算新区块Hash值的难度,所以人们形象地将这种试出合格Hash值的过程称为挖矿。

矿池概念

比特币系统在Hash之前的区块信息中生成的Hash值需要满足原始Hash值之前18个0开始的条件。 Hash值是由0-9、az、AZ的62个字符组成的字符串。 Hash值的每一位有62种可能,以18个0为例,理论上需要尝试62的18次方才能计算出符合条件的Hash值,计算量非常大。 区块链的发展,能够单独计算如此庞大任务的单个节点已经很少了。 因此,每个参与记账的节点组成一个矿池,将它们联合起来记账,最终收益按照算力的百分比进行分配。

块状结构

一般分为两部分:区块头+区块体

区块头包含:当前比特币系统版本号、前一个区块哈希值、序列号、随机数、时间戳、默克尔根……

区块体包含: 区块创建过程中产生的所有交易记录。 将这些交易记录成对进行哈希计算,然后将得到的值成对进行哈希计算,最终得到一个唯一的根哈希值。 这个值就是默克尔根。 这个过程画出的结构图叫做Merkle Tree

过程如下:

比特币区块和比特币的区别_比特币的区块头中包含的重要参数_比特币与区块链的关系

主链的概念

累积工作量最多的区块链称为主链,也称为最长链。 每个节点总是选择并尝试扩展主链。

当一个新的区块被添加到区块链中时,可能有两个(或更多)节点同时计算出符合条件的哈希值并生成一个区块。 这种情况会导致分叉。

由于比特币网络中的广播机制是一个类似水波一样不断向周围传播的过程,在这个过程中,当同时产生的两个区块在广播时,有的节点先接收到块A,有的节点先接收到块A。首先接收块A。 先接收区块B,两者都是主链的扩展,会发生分叉。 此时会分叉出两条竞争链,如图:

比特币的区块头中包含的重要参数_比特币与区块链的关系_比特币区块和比特币的区别

收到两个区块的节点将继续使用工作量更大的一条作为主链,将另一条保存为备份链(保存因为备份链将来可能会超越主链成为新的主链)。

补充:比特币系统将区块生成间隔设置为10分钟,这是在更快的交易确认和更低的分叉概率之间的折衷。 更短的块生成间隔将允许更快地确认交易,但也会导致更高的分叉概率。 相对而言,如果选择更长的区间,会导致交易确认时间更长,但分叉的概率也会降低。

※问:理论上出块的速度取决于节点的算力。 十分钟这个时间,比特币系统是怎么定的?

https://blog.csdn.net/ipenx/article/details/77951801
https://bitcoin.stackexchange.com/a/857
根据这两篇文章得出的结论说:
在比特币系统计算生成新区块的算法中利用一个属性 “难度值” 来影响了区块生成的速度,
此 “难度值” 会在每隔 2016的倍数个区块生成时(按照每个区块10分钟计算大约是14天)触发调整,
计算公式为 : 旧的难度值 * 14天 / 生成之前2015个区块的总时常

SPV节点(Simplified Payment Verification简单支付验证)

通过 SPV 钱包访问比特币网络的节点称为 SPV 节点。 它们的特点是无需同步存储完整的区块链数据即可验证交易。 SPV节点只下载区块头的数据,大小只是完整区块链的大小。 数据的千分之一。

SPV节点如何验证交易?

SPV节点收到广播后,会向相邻节点请求(通过MerkleBlock消息的方式)该笔交易以及该笔交易的Hash计算所涉及的其他交易,并回溯Merkle根的序列进行验证确认。

举例如下:

比特币与区块链的关系_比特币区块和比特币的区别_比特币的区块头中包含的重要参数

如果SPV节点要验证交易“4”,它首先向相邻节点询问(3,4,12,34,1234,5678,Merkle Root)这些Hash值,也称为验证路径。 通过这种方式,可以确认交易的正确性和有效性。

补充:在N笔交易组成的区块中,要确认某笔交易是否正确,只需要计算log2(N)字节的Hash值即可。

节点如何加入比特币网络?

参考:

比特币代码中有几个域名是硬编码的。 客户端启动时比特币的区块头中包含的重要参数,通过DNS请求这些地址获取其他节点的IP。客户端通过接收IRC网络广播获取并连接到节点。 手动设置节点地址,可以通过命令行写入,也可以使用本地配置文件。 拜占庭将军问题

参考:

本质上叫做分布式系统一致性问题

简单的解释就是比特币网络上的各个节点并不属于彼此,那么如何让区块一致并被各个节点认可呢?

比特币系统中引入了“工作量证明”的概念来解决这个问题。 通过工作量证明,增加发送信息的成本,降低节点发送消息的速率,使得只有一个节点(或者很少)在广播,广播时会附上自己的签名。

补充:工作量证明就是挖矿的过程。 准确的说法是抢夺记账权,即只有当节点通过穷举测试找到某个满足特定条件的值来生成区块Hash值时,才有记账权。 一旦该节点记账完成后,通知其他节点不再计算区块,而是接收并验证该节点发送的区块正解。

比特币脚本

未花费的交易输出(UTXO(Unspent Transaction Output))

比特币交易都是基于UTXO,即交易的输入是上一笔交易未花费的输出,而本次交易的输出可以作为下一笔新交易的输入。

补充:

挖矿奖励属于一种可以没有输入的特殊交易(称为 coinbase 交易)。

UTXO 是交易的基本单位,不可分割。

比特币没有余额的概念,只有分散到区块链中的UTXO。

比特币交易流程:

首先提供一个解锁UTXO的脚本(称为解锁脚本:Signature script)(使用私钥匹配锁定脚本),称为交易输入,交易输出指向一个脚本(称为锁定脚本:PubKey脚本) ),这个脚本表示:谁的签名(signature是普通形式,不一定是签名)能匹配输出地址比特币的区块头中包含的重要参数,钱就给谁。

节点通过同时执行“解锁脚本”和“上一笔交易的锁定脚本”来验证交易,结果为有效交易。

以太坊

以太坊是一个基于区块链技术的去中心化应用平台。 它允许任何人在平台中构建和使用运行在区块链技术上的去中心化应用程序。

智能合约

如果将以太坊理解为类似于Android的系统平台,那么在以太坊上开发的能够自动执行(由消息驱动)并以代码形式编写的合约(特殊交易)或程序称为智能合约。 .

补充:智能合约非常适用于对信任、安全、持久性要求高的应用场景,例如:数字货币、数字资产、投票、保险、金融应用、预测市场、财产所有权管理、物联网、点对点- 同行交易等

官方推荐的智能合约编程语言是Solidity,文件扩展名以.sol结尾。

运行环境:EVM

EVM(以太坊虚拟机)是以太坊中智能合约的运行环境。 可以理解为Java的JVM虚拟机的概念。

以太坊客户端(钱包)Geth/Mist

Geth(go-ethereum)是以太坊开发中使用的典型客户端,基于Go语言开发。 提供账户管理、挖矿、转账、部署和执行智能合约等功能。 可以说它既是客户端又是开发工具。

与Geth相比,Mist是一个图形化操作界面的以太坊客户端。

补充:另外,以太坊官方还有另外一款轻量级客户端钱包Ethereum Wallet,它是一个独立的钱包和DAPP浏览器,没有开发功能。