什么是比特币 ⽐特币数据模型
比特币数据模型构建在区块链技术之上,其主要特点是去中心化、不可篡改和安全加密。比特币数据模型由区块链数据结构、加密机制、P2P网络协议和智能合约组成。
区块链数据结构是比特币数据模型的基础,它包含交易历史、挖矿记录、钱包地址等数据。加密机制使用数字签名和哈希算法确保区块链数据的安全性和完整性。P2P网络协议使参与者能够在网络中发送、接收和存储数据。智能合约是一种自动执行的计算机协议,它可以自动执行或管理特定的金融或商业交易。
比特币数据模型的核心思想是利用区块链技术实现去中心化的金融系统,使参与者能够安全可靠地进行交易。这一模型的实施使得参与者可以跨越地域、货币和政治边界,实现自由、公平和安全的金融交易。
UTXO 账⼾模型 不同于现在主流的区块链账⼾模型,现在的公链项⽬⼤部分都是使⽤不同于比特币的账⼾模型。作为第⼀个出现的区块链现⾦系统,Bitcoin 采⽤了 UTXO 模型作为其底层存储的数据结构,全称为 Unspent Transaction output,也就是未被使⽤的交易输出。 每⼀笔⽐特币交易都由输⼊和输出组成,其中输⼊包含交易的数据⾦额以及地址,输出包含交易的输出⾦额以 及输出地址。在⽐特币交易过程中,每⼀笔交易的输⼊都是来⾃先前的交易的输出,并且每⼀笔交易的输出也可以成为后续交易的输⼊。 因为每⼀笔⽐特币交易都是基于先前的交易输出,所以只有在输⼊被花费之前,才能进⾏新的交易。这样可以避免重复使⽤⽐特币,保证交易的安全性。
交易内容 在⼀笔交易⾥⾯,记录了交易⾥每⼀笔输⼊跟输出,类似于复式记账法所记录的内容:
上⾯的复式记账法可以理解为⽐特币中的⼀笔交易,左侧可以理解为这笔交易的输⼊,从 4 个地址把⽐特币进 ⾏输⼊,右侧可以理解为该笔交易的输出,这笔交易输出到三个地址上,输⼊总⾦额为 0.55,输出总⾦额为 0.5, 差异部分为矿⼯的收⼊。 因此在同⼀笔交易⾥,必定满⾜这样的⼀个等式: 总交易输⼊ - 总交易输出 = 交易费 余额计算 所有的交易都是通过 UTXO 账⼾模型的交易保存在区块链上,某⼀个”账⼾”中的余额并不是记录在某个区块上 的,⽽是由当前区块链⽹络中所有跟该账⼾有关的 UTXO 组成的。通过以上复式记账的运算,如果要计算某个地 址的余额,需要计算在多个复式记账的账本中,⽤⼾未花费的⾦额,可以得出等式: 地址余额 = 地址总输⼊ - 地址总输出
相关币种 UTXO 模型是⽐特币和许多其他区块链系统中使⽤的交易模型。以下是⼀些使⽤ UTXO 模型的链,这些区块链 的数据结构,以及计算⽅式基本保持⼀致,我们在⽂章中使⽤到的查询,都能够套⽤在这些区块链的数据上: ⽐特币 (BTC) ⽐特现⾦ (BCH) 莱特币 (LTC) 狗狗币 (DOGE) 数据结构 概览 区块链的数据有区块链的数据结构,但是对于分析来说不太友好,因此,我们需要把区块链数据转化成关系型数 据库来分析,转化后,数据的关系分为 Blocks,Transactions 组成。关系如下:
数据关系图 其中 bitcoin_transaction_inputs,bitcoin_transaction_outputs 这两张表是在 Footprint(后续简称 FP)中 为了可以⽅便进⾏ UTXO 模型的计算⽽衍⽣出来的数据表,通过上图我们可以观察到他们之间的关系有以下的 特点: ⼀个区块包含了多笔交易,通过 block_hash 进⾏关联 在同⼀笔交易内,有多笔交易输⼊输出,通过 transaction_hash 进⾏关联 UTXO 计算推演 接下来我们来尝试⼀下使⽤ FP 数据分析⼯具来推演⼀下 UTXO 计算余额的过程,在过程中可以更加清晰地了 解整个 UTXO 的数据结构,以便使⽤ FP 提供的⽐特币 Bronze 级别的数据进⾏其他指标的计算。 通过 Bitcoin Rich List 我们找到⼀个最有钱的⽐特币钱包,我们以这个排名第四(统计于 2022/12/22)的地 址:1LQoWist8KkaUXSPKZHNvEyfrEkPHzSsCd 为例⼦,进⾏数据分析,通过⽹站查询的信息我们得知此地址 的⼀些信息: inputs:37 笔 outputs:164 笔 ⾸次交易:2022-06-15 08:25:24 余额:124348 BTC
我们使⽤ FP 分析⼯具来尝试获取这些数据,以验证整个链上的数据是否与 Rich List 上给出的结果保持⼀致。
输⼊/输出列表 通过 FP 提供的 bitcoin_transaction_inputs 表,执⾏以下 SQL select array_join(inputs.addresses,',') as address, inputs.type, -inputs.value as value, block_timestamp from bitcoin_transaction_inputs as inputs WHERE CONTAINS(addresses,'1LQoWist8KkaUXSPKZHNvEyfrEkPHzSsCd') and block_timestamp > timestamp '2022-06-13';
计算结果:
总输出:37 笔 ⚠ 注意: bitcoin_transaction_inputs 表意指执⾏了 inputs ⾏为的地址相关记录,钱包执⾏了 inputs 动作,那钱 包的的钱⾃然就会流向 outputs,因此如要计算有多少 outputs 就需要使⽤ inputs 表,反之亦然,计算多 少 inputs 就要使⽤ outputs 表。 这⾥做 block_timestamp 过滤⽬的是为了提⾼查询的效率,当知道⾸次交易的区块时间是在 2022-06- 13 ,就可以对数据进⾏时间筛选以提⾼查询效率。 输⼊/输出总⾦额 通过对在 FP 的 SQL 界⾯执⾏以下 SQL, 对该地址相关的 inputs 记录进⾏汇总,获取到该地址总输出⾦ 额,outputs 同理 select array_join(inputs.addresses,',') as address, inputs.type, SUM(-inputs.value) as value from iceberg.footprint.bitcoin_transaction_inputs as inputs WHERE CONTAINS(addresses,'1LQoWist8KkaUXSPKZHNvEyfrEkPHzSsCd') and block_timestamp > timestamp '2022-06-13' group by 1,2 ; 计算结果:
总输⼊:21016587227364 总输出:-8581746649469 交易未输出(UTXO)/余额 根据上⾯提⾼的公式,交易未输出⾦额(UTXO)等于总输⼊减去总输出,得到余额 124348 BTC 与 Rich List 的数据保持⼀致,⾄此,我们已通过链上数据验证了该地址余额的真实性。 (21016587227364 - 8581746649469) / 10e7 = 124348.40577895 备注: 因为 1 BTC = 100000000 satoshi,⽽⽐特币链上的数据是以 satoshi 为计算单位,因此得到数据后需要进 ⾏转换
应⽤场景(课后作业) 通过 FP 提供的数据表,可以进⾏更深⼊的探索,例如以下的⼀些场景: 计算每⼀笔收益所产⽣的矿⼯⼿续费 计算世界上最有钱的⽐特币钱包 计算多少地址属于⻓期 holder(⻓期没有发⽣ inputs ⾏为的地址) 同时结合 FP 提供的 alerts 功能,可以对⼀些⼤鲸钱包进⾏监控,监控钱包 inputs 以及 outputs ⾏为,获 取第⼀⼿的链上动态,以便做出更好的投资决策。 参考链接