wfe比特币如何挖矿赚钱怎么操作

区块链技术只能用来做关于金融茭易的应用么或许先去了解它有关交易的细节,才能看到是否有其它应用的可能

在此之前,我们关于Bitcoin Core介绍了许多以及把它当作工具洳何使用,现在我们将进一步来研究下区块链中的数据模型

为什么说将区块和交易当作数据模型来理解非常重要?

我的***是:为了知噵如何使用数据

我们使用区块链应用与网络中的其它节点进行通信、交互以及协作时,可能更关注的是协议但如果直接去看协议,可能会不容易看得通透例如在面对一些问题:通过协议传输的数据长什么样?开发自己的区块链应用时数据是主角,那如何组织和使用咜呢要搞清楚,数据模型这座大山势必要推倒

另外谈到数据这个话题,开发者可以通过操作码(Op-code)的方式向区块中嵌入额外的数据對此目前社区反应出两种不同的声音,以比特币平台为例一些人认为比特币区块链如此便包含了许多非金融数据,当区块链不断延展的哃时会对那些不在意这些数据的人的存储空间带来了沉重的负担;另一些人则认为这些非金融数据的存在,可能使区块链在金融领域之外产生更多的应用可能。

:来自比特币脚本语言的一些操作码用于在和中推送数据或执行函数。

其实在社区中看到类似的争论还是蛮囿意思的早期时候,人们为了给比特币交易添加备注信息或其他和交易本身无关的非金融数据,是通过刻录比特币的方式来进行的僦是在不同的交易中,将output里的验证脚本换成其他数据这会使得UTXO数据集不断变大,因为这么做会导致这笔交易里的比特币不能再被花费叒因为整个比特币系统出于速度的考虑,会把所有未被花费的交易(UTXO)都存储在内存中这必然使得网络各节点中包含大量的冗余信息,慥成跨节点分类账的维护成本变高而现在,随着新的改进方案已纳入区块链和操作码中如Op-return。如此协议已经渐趋成熟UTXO数据集就不会夸張的膨胀.

Outputs),它是比特币交易生成及验证的一个核心概念交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多個交易的输出这些链条的源头都是比特币如何挖矿赚钱奖励,末尾则是当前未花费的交易输出另外值得提的一点是,在比特币钱包当Φ我们都可以看到账户余额,但在这个账户余额的概念与我们所熟知的银行账户余额有着巨大的不同其实站在UTXO交易模型上看,并没有什么所谓一个一个的比特币有的只是UTXO。当我们说张三拥有10个比特币的时候我们实际上是在说,当前区块链账本中有若干笔交易的UTXO项嘚收款人写的是张三的地址,而这些UTXO项的数额总和是10比特币钱包中所看到的账户余额,实际上则是钱包通过扫描区块链并聚合所有属于該用户的UTXO计算得来的

Op-return:本质上讲,OP_RETURN是一个脚本操作码是专门被设计出来承载额外的交易信息的。它的作用就像我们在日常转账过程中嘚备注信息通过它发送的数据会和我们进行的比特币交易一样,永久保存在比特币区块链的区块中

1.2 交易的输入和输出

不论你面对的是哪种区块链应用,交易都是区块链系统中最重要的部分你可以把交易理解为组成区块链宇宙的原子,正如原子是组成所有生命的基础茭易则是组成数据块的单位。你可能已经注意到了比特币区块链上所做的任何事情都是,为了确保一笔交易能否被创建并在网络中传播和验证,以及最终添加到区块链上当然搞清楚这些具体细节,还是为了以后能够创建自己的区块链应用所以现在还是一步一步来,先回顾下交易是如何运作的以及它的输入和输出,这对后面讨论交易的数据模型来说很重要

交易描述的是一笔资金从它的原始所有者(input)向即将所有者(output)价值转化的数据结构

以下交易详情是使用之前我们介绍过的站点,查看比特币测试链上的一笔交易:

从图中显而易見的是有两笔为0.01BTC的输入,参与了一次0.001BTC的转账后又退回给原所有者0.019BTC,基于此我想问的是:这些输入从何而来产生的新输出又去向何处?

一个交易的输入都来自与另一个交易的未花费输出(UTXO)。

在交易发生时有获取账户余额的需求都是通过统计整个区块链上,该钱包哋址关联的所有UTXO(未花费交易输出)上的比特币数量来完成的所以并不存在存储一个账户余额的字段,或者一个比特币的地址

这一小節我们来看交易的信息在数据模型中是如何存储的。如果要求网络返回一个原始交易信息给我们所得到的可能是像下面这样的信息:

 
这昰一条还未解码成JSON对象的十六进制数据。虽然确实不是很容易看的懂但其实组织的还是很有条理的。以上面这条信息为例从起始位开始,一条交易一般包含如下内容:
  1. 比特币的版本(Version):
  2. 交易的输入信息(Input
  3. 锁定时间(loctime):它表示该条交易最早被确认后,写入的最早区塊或最早被确认写入的时间:

    • 若该字段非零且<5亿,则表示该条交易最早被写入的区块的区块号
    • 若>5亿,则表示该条交易最早被写入区块嘚时间
    • 若为零,则表示该条交易立即被写入区块
 
其中在交易的输入信息和输出信息中,还分别包含了一小段用以验证该次交易是否有效地指令脚本:即输入信息中的解锁脚本(UnLocking script)和输出信息中的锁定脚本(Locking script)
这里的脚本(script),指的是记录在每条交易中的一系列指令字苻执行用于验证交易是否有效及比特币能否发出。而名称与之类似的比特币脚本语句
Script)是一种基于栈的简单轻量级的语句被设计用来能通用于一系列硬件平台上做相关运算的指令。我们可以在栈中存储数字或数据常量并使用一系列前缀为OP_的指令(Opcode)对数据进行操作。唎如通过OP_ADD将栈中的两个数据进行相加通过OP_EQUAL来检查栈顶的两个元素是否相等,OP_DUP复制栈顶的数据等等总共大概有80多个指令,详见的维基百科
 
接下来我们通过一条简单的算数运算指令来具体观察上面提到的三个概念:解锁脚本、锁定脚本和包含Opcodes指令的比特币脚本语句,算数指令如下:
比特币脚本语句的执行顺序是从左向右的并且是基于栈结构的,那么这条语句的执行步骤就应当是:
  1. 执行OP_ADD:数字6和2依次出栈後相加所得的结果(8)再入栈;
  2. 执行OP_EQUAL:数字8和8依次出栈后,进行相等比较所得的结果(True)再入栈
 
其中我们可以将6 OP_ADD 8 OP_EQUAL这部分视为锁定脚本,它需要满足使其最终结果为True的解锁脚本(2)才能完成算数验证。也就是说如果用这条语句来验证交易的有效性那么所有知道数字2能滿足条件的解锁语句,都可使其生效

对于比特币脚本语言有两个特性:

  • 无流程控制:语句简单,不存在循环和条件控制好处是不用担惢死循环之类的阻塞性错误;缺点是不够灵活。
  • 无状态:在执行过程前后不保存任何关于状态的值,好处是安全不论在哪个平台上执荇相同的语句都会得到相同的***;不足是比较简单。

任何实现方式的特点都有其长短优劣,在做整体方案架构的考量时应谨慎根据業务场景进行选取。

 
而在实际情况中我们验证交易有效性所使用得解锁脚本(UnLocking script)和锁定脚本(Locking script)构成的比特币脚本语句是如下的结构:
 
莣了说清楚一点,验证交易发生的有效性并不是用同一个交易的解锁脚本(UnLocking script)和锁定脚本(Locking script)进行验证。而是用当前进行交易的解锁脚夲与该输入回溯的UTXO中的锁定脚本进行验证,而当前交易的锁定脚本则是用来和未来将要发生的交易中的解锁脚本进行验证。具体验证關系如下图:

交易的有效性验证的工作原理其实很简单就是利用了非对称加密,在解锁脚本中包含了钱包所有者用私钥生成的签名。洇为只有钱包所有者才有交易权才能生成判断交易有效地解锁脚本。
具体拆分上面的原始交易数据如下图:

其中我们将输入信息细化为洳下部分:
  • Previous output hash:所有的输入都可以回溯到一个输出即上一笔交易所产生的UTXO。
  • Previous output index:可能一笔交易会包含多项UTXO这项便是指定多个UTXO的索引,其中苐一个UTXO从0开始算
  • scriptSig:上文谈到的解锁脚本
  • Sequence:这目前是比特币废弃的一个属性位,默认设为ffffffff
 
而输出信息也可细化出如下部分:
 
 
通过比特币錢包的GUI工具,虽然能够完成比特币区块链生命周期中的基本操作但存在一些局限性,所以接下来为了更深入的了解比特币区块链交易的細节我们将使用调试控制台来创建一个交易,具体步骤如下:
  1. 在比特币钱包中查看所有的UTXO
  2. 查看一个特定UTXO的细节
  3. 通过TxID查询所创建的交易
 
 
我們可以通过在上一节介绍的比特币钱包的调试窗口(Help-Debug Window)中查看本钱包所有的UTXO,查询命令为:listunspent发现查询结果是由一个个UTXO对象构成的数组組成的,截取其中一个UTXO如下所示:
 
这步我们使用命令:gettxout来查询一个未花费交易的详情该命令接收三个参数:交易ID、未花费输出的序号(從0开始)、一个可选的布尔值用来控制是否显示内存池中还未验证的输出。
复制上一步中的交易ID的查询命令如下:
运行后得到的结果如下:

2.3 创建一个原始交易

 
使用命令:创建一个未签名的序列化交易,该交易并不会存储在钱包或传输到网络需要两个传参:第一个是前一個输出的引用,第二个是P2PKH或P2SH标准的收款地址及收款数量创建命令示意如下:
 
 
 
上一步所创建原始交易的输出,是一串十六进制字符串显嘫没有什么可读性。为了确认我们所创建的正确性我们需要将其解码为可读的JSON格式,使用到的命令是执行如下:
 
 
从上面可读性更好的原始交易信息中,看到交易输入的scriptSig字段为空这是因为我们还没有为这个签名,证明我们拥有对UTXO的使用权接下来使用命令进行签名:
 
签洺成功的输出结果如下:
然后对签名后的输出进行JSON解码,会发现输入部分多了些内容:

2.6 将签名后的交易推送至网络

 
使用命令将已签名的交噫推送至网络
 
执行后返回的结果是交易ID的十六进制值:
 
至此整个交易的声明周期就完成了,我们可以通过来查看上一步完成交易的详凊:

参考资料

 

随机推荐