bitcoinjs学习1—P2PKH

1. 概述

在本学习笔记中,我们将深入探讨如何使用 bitcoinjs-lib 库构建和签名一个 P2PKH(Pay-to-PubKey-Hash) 比特币交易。P2PKH 是比特币网络中最常见和最基本的交易类型之一,理解其工作原理是掌握比特币交易构建的关键。

想要详细了解p2pkh工作原理可以查看该网址:p2pkh(Pay to PublicKey Hash)


1.1 目标

  • 主要目标:学习如何使用 bitcoinjs-lib 构建、签名并广播一个 P2PKH 交易。
  • 具体任务
    1. 生成一个 P2PKH 地址。
    2. 构建一个包含输入和输出的交易。
    3. 将交易广播到regtest网络中。

1.2 P2PKH 的工作原理

  1. 锁定资金

    发送方创建一个交易输出,将比特币锁定到接收方的公钥哈希(即地址)。

  2. 解锁资金
  • 接收方在花费比特币时,需要提供:
    • 公钥。
    • 使用私钥生成的签名。
  • 输入脚本(scriptSig)格式:<Signature> <PublicKey>
  1. 验证过程
    • 比特币网络会验证签名是否与公钥匹配,以及公钥哈希是否与输出脚本中的哈希一致。

在比特币脚本中,OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIGP2PKH(Pay-to-PubKey-Hash) 交易的 锁定脚本(scriptPubKey) 的核心部分。它定义了如何锁定比特币以及如何解锁比特币的条件。

以下是对每个操作码的详细解释:


1. OP_DUP

  • 作用:复制栈顶元素。
  • 操作
    • 将栈顶的元素复制一份,并将副本压入栈中。
  • 示例
    • 如果栈顶是 A,执行 OP_DUP 后,栈变为 [A, A]

2. OP_HASH160

  • 作用:对栈顶元素进行哈希运算。
  • 操作
    • 弹出栈顶元素,先进行 SHA-256 哈希,再进行 RIPEMD-160 哈希,最后将结果压入栈中。
  • 示例
    • 如果栈顶是 A,执行 OP_HASH160 后,栈变为 [Hash160(A)]

3. <PubKeyHash>

  • 作用:将接收方的公钥哈希压入栈中。
  • 操作
    • 这是一个数据推送操作,将接收方的公钥哈希(20 字节)压入栈中。
  • 示例
    • 如果接收方的公钥哈希是 B,执行后栈变为 [Hash160(A), B]

4. OP_EQUALVERIFY

  • 作用:验证栈顶两个元素是否相等,并移除它们。
  • 操作
    • 弹出栈顶两个元素,比较它们是否相等。
    • 如果相等,继续执行;如果不相等,脚本执行失败。
  • 示例
    • 如果栈顶是 [Hash160(A), B],执行 OP_EQUALVERIFY 后:
      • 如果 Hash160(A) == B,栈为空,继续执行。
      • 如果 Hash160(A) != B,脚本失败。

5. OP_CHECKSIG

  • 作用:验证签名和公钥是否匹配。
  • 操作
    • 弹出栈顶两个元素:签名和公钥。
    • 使用公钥验证签名是否对当前交易有效。
    • 如果验证成功,将 true 压入栈中;否则,将 false 压入栈中。
  • 示例
    • 如果栈顶是 [Signature, PublicKey],执行 OP_CHECKSIG 后:
      • 如果签名有效,栈变为 [true]
      • 如果签名无效,栈变为 [false]

6. 整体脚本的执行流程

假设解锁脚本(scriptSig)提供了签名和公钥:<Signature> <PublicKey>,锁定脚本(scriptPubKey)为 OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

执行步骤:
  1. 初始栈

    • 解锁脚本将签名和公钥压入栈中:
      [Signature, PublicKey]
      
  2. 执行 OP_DUP

    • 复制公钥:
      [Signature, PublicKey, PublicKey]
      
  3. 执行 OP_HASH160

    • 对公钥进行哈希:
      [Signature, PublicKey, Hash160(PublicKey)]
      
  4. 压入 <PubKeyHash>

    • 将接收方的公钥哈希压入栈中:
      [Signature, PublicKey, Hash160(PublicKey), PubKeyHash]
      
  5. 执行 OP_EQUALVERIFY

    • 比较 Hash160(PublicKey)PubKeyHash
      • 如果相等,移除这两个元素:
        [Signature, PublicKey]
        
      • 如果不相等,脚本失败。
  6. 执行 OP_CHECKSIG

    • 使用公钥验证签名:
      • 如果签名有效,栈变为:
        [true]
        
      • 如果签名无效,栈变为:
        [false]
        
  7. 脚本结果

    • 如果栈顶为 true,交易有效,资金可以解锁。
    • 如果栈顶为 false,交易无效,资金无法解锁。

1.3 工具和技术栈

1.3.1 bitcoinjs-lib
  • 简介bitcoinjs-lib 是一个用于处理比特币交易的 JavaScript 库。它支持构建、签名和解析比特币交易,适用于 Node.js 和浏览器环境。

  • 安装

# 选择一个目录作为项目目录,打开vscode,打开命令行窗口
npm init -y# 安装依赖
npm i bitcoinjs-lib ecpair tiny-secp256k1
1.3.2 比特币测试网
  • 简介:比特币测试网(Testnet)是一个用于开发和测试的比特币网络,其功能与主网相同,但比特币没有实际价值。(新手建议还是使用regtest,testnet测试网需要申请领取测试币,每次领取金额都较少,一般为10000聪)
  • 用途
    • 测试交易构建和签名。
    • 避免在主网上浪费真实比特币。
  • 获取测试网比特币
    • 使用测试网水龙头(如 testnet-faucet.com)获取免费的测试网比特币。
1.3.3 比特币测试网浏览器
  • 用途:查看交易状态和区块链数据。
  • 推荐工具
    • blockstream.info/testnet
    • mempool.space/testnet

1.4 p2pkh交易demo

1.4.1准备工作

交易:Alice向Bob转账2个比特币
先使用bitcoin-core向Alice的地址转2个比特币,再用这笔未花费交易给Bob发送

在这里插入图片描述

在交易记录中右击刚刚的交易,复制原始交易,再根据上一节预备知识中提到的解析交易

或者使用控制台(命令行窗口)

sendtoaddress mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r 2
getrawtransaction txid
decoderawtransaction hex

记录交易的txid、vout中是alice的输出的次序n,金额value
在这里插入图片描述

以下是Alice给Bob发送比特币的代码(使用p2pkh)

const bitcoin = require('bitcoinjs-lib');
const network = bitcoin.networks.regtest;ECPairFactory = require('ecpair').default;
ecc = require('tiny-secp256k1');
const base58check = require('base58check');  //npm i --save base58check
ECPair = ECPairFactory(ecc);
const hashtype = bitcoin.Transaction.SIGHASH_ALL;// Alice给Bob发送2个比特币
const ONE = Buffer.from('0000000000000000000000000000000000000000000000000000000000000001', 'hex',);
const keyPairAlice = ECPair.fromPrivateKey(ONE, { network });
const TWO = Buffer.from('0000000000000000000000000000000000000000000000000000000000000002', 'hex',);
const keyPairBob = ECPair.fromPrivateKey(TWO, { network });
// alice_address: mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r
// bob_address: mg8Jz5776UdyiYcBb9Z873NTozEiADRW5H// alice上一笔未花费的交易的txid,
const txid = '4a3cc600d4973479aafb62b5789590dd7738c3f9f1956a513a361e20ef56f9bb'
const vout = 1; // 上一笔交易中的输出
const amount = BigInt(200000000);// 转账金额// 收款人bob的地址
const { address } = bitcoin.payments.p2pkh({ pubkey: keyPairBob.publicKey })
var PayeeBobAddr = base58check.decode(address, 'hex')
console.log('Bob_hashPubkey:', Buffer.from(PayeeBobAddr.data, 'Hex').toString('hex'));const tx = new bitcoin.Transaction(network);// 添加输入
tx.addInput(Buffer.from(txid, 'hex').reverse(), vout);// 添加输出
const outputScript = bitcoin.payments.p2pkh({ pubkey: keyPairBob.publicKey }).output;
tx.addOutput(outputScript, amount - BigInt(10000));// 添加签名
// 上一笔交易的输出脚本
const preoutputScript = bitcoin.payments.p2pkh({ pubkey: keyPairAlice.publicKey }).output;
// 生成比特币交易中某个输入的签名哈希值(sighash)。hashtype=1表示对交易的所有输入都进行哈希处理
const signhash = tx.hashForSignature(0, preoutputScript, hashtype);// 构造p2pkh的解锁脚本: [签名 公钥]
const scriptSig = bitcoin.script.signature.encode(keyPairAlice.sign(signhash), hashtype);
tx.setInputScript(0,bitcoin.script.compile([scriptSig, keyPairAlice.publicKey])
)// 输出交易原始数据
console.log('Raw Transaction:', tx.toHex());// 广播交易
//sendrawtransaction <raw_transaction_hex>// 获取txHex: getrawtransaction txid
// 解析交易: decoderawtransaction txHex

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17539.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)

2024年博客之星年度评选—创作影响力评审主题文章创作评审目前排名 2024年博客之星主题文章创作评审文章得分公布&#xff01;2024年博客之星创作影响力评审2024年博客之星主题文章创作评审目前排名公布&#xff01; 【2024博客之星】恭喜完成✅主题创作的226位博主&#xff0…

机器学习-1:线性回归

常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…

java每日精进 2.13 Ganache(区块链本地私有化部署)

需求&#xff1a;使用区块链实现数据村存储&#xff0c;记录一些不可篡改的交互信息&#xff0c;网络环境为内外网均需要部署&#xff1b; 1.准备工作&#xff08;软件安装&#xff09; 1.1 安装 Node.js 和 npm 1.2 安装 Ganache 地址如下&#xff1a;windows有可视化界面 &a…

RAGFlow和Dify对比

‌ RAGFlow和Dify都是基于大语言模型&#xff08;LLM&#xff09;的应用开发平台&#xff0c;具有相似的功能和应用场景&#xff0c;但它们在技术架构、部署要求和用户体验上存在一些差异。‌‌ RAGFlow和Dify对比 2025-02-13 22.08 RAGFlow‌ ‌技术栈‌&#xff1a;RAGFlow…

day9手机创意软件

趣味类 in:记录趣味生活&#xff08;通用&#xff09; 魔漫相机&#xff1a;真人变漫画&#xff08;通用&#xff09; 活照片&#xff1a;让照片活过来&#xff08;通用&#xff09; 画中画相机&#xff1a;与众不同的艺术 年龄检测仪&#xff1a;比一比谁更年轻&#xf…

Next.js 15【实用教程】2025最新版

官网 https://nextjs.org/docs/app/getting-started Next.js 简介 Next.js 由 Vercel 开发和维护&#xff0c;旨在解决单页应用&#xff08;SPA&#xff09;和多页应用&#xff08;MPA&#xff09;在性能和 SEO 上的不足。 核心特性 服务端渲染&#xff08;SSR&#xff09;--…

MySQL 联合索引的最左匹配原则

环境&#xff1a;MySQL 版本&#xff1a;8.0.27 执行计划基础知识 possible_keys&#xff1a;可能用到的索引 key&#xff1a;实际用到的索引 type: ref&#xff1a;当通过普通的二级索引列与常量进行等值匹配的方式 询某个表时const&#xff1a;当我们根据主键或者唯一得…

2025 西湖论剑wp

web Rank-l 打开题目环境&#xff1a; 发现一个输入框&#xff0c;看一下他是用上面语言写的 发现是python&#xff0c;很容易想到ssti 密码随便输&#xff0c;发现没有回显 但是输入其他字符会报错 确定为ssti注入 开始构造payload&#xff0c; {{(lipsum|attr(‘global…

【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?

前言&#xff1a; Hello大家好&#xff0c;我是Dream。不知不觉2024年已经过去&#xff0c;自己也马上迈入23岁&#xff0c;感慨时间飞快&#xff0c;从19岁刚入大学加入CSDN&#xff0c;到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光&#xff0c;在这里…

RAG(检索增强生成)落地:基于阿里云opensearch视线智能问答机器人与企业知识库

文章目录 一、环境准备二、阿里云opensearch准备1、产品文档2、准备我们的数据3、上传文件 三、对接1、对接文本问答 一、环境准备 # 准备python环境 conda create -n opensearch conda activate opensearch# 安装必要的包 pip install alibabacloud_tea_util pip install ali…

Qt事件机制

目录 一、事件基本概念 1.1 事件基本概念和产生 1.2 事件类 1.3 事件发送 二、事件的捕获处理 2.1 事件处理流程 2.2事件分发&#xff08;event&#xff09;处捕获事件 2.3 事件过滤器 2.4 重新实现事件处理函数 三、 QEventLoop 3.1事件循环基本概念 3.2 QEventL…

20250212:sigmastar系列2-获取UUID进行授权

距离上一篇Sigmastar文章已经过去3年了。最近基于Sigmastar-330 开发人脸识别SDK,需要进行授权管理,所以需要获取UUID作为激活、授权的凭证。 本文记录2个事情:授权逻辑 + sigmastar获取UUID 1:授权流程 step1:算法SDK在设备上电,算法初始化环节,校验本地是否有加密存…

STM32F407通过FSMC扩展外部SRAM和NAND FLASH

1 扩展外部SRAM 1.1 地址情况 FSMC控制器的存储区分为4个区(Bank)&#xff0c;每个区256MB。其中&#xff0c;Bank1可以用于连接SRAM、NOR FLASH、PSRAM&#xff0c;还可以连接TFT LCD。Bank1的地址范围是0x60000000&#xff5e;0x6FFFFFFF。Bank1又分为4个子区&#xff0c;每…

MySQL Workbench工具 导出导入数据库

第一步 数据库导出 1、打开workbench->连接数据库->Server->Data Export 2、选择要导出的数据库&#xff0c;Export Self-Contained File ->更改导出位置和数据库名->Start Export 3、提示“sql has finished”&#xff0c;没有error表示导出成功 第二步 数据…

我用AI做数据分析之四种堆叠聚合模型的比较

我用AI做数据分析之四种堆叠聚合模型的比较 这里AI数据分析不仅仅是指AI生成代码的能力&#xff0c;我想是测试AI数据分析方面的四个能力&#xff0c;理解人类指令的能力、撰写代码的能力、执行代码的能力和解释结果的能力。如果这四个能力都达到了相当的水准&#xff0c;才可…

广告深度学习计算:阿里妈妈大模型服务框架HighService

一、背景 HighService(High-Performance Pythonic AI Service) 是在支持阿里妈妈业务过程中&#xff0c;不断提炼抽象出的高性能Python AI服务框架&#xff0c;支持视频、图文、LLM等多种模型&#xff0c;能够显著加快模型的推理速度&#xff0c;提高集群的资源利用效率。随着S…

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

企语企业管理系iFair(F23.2_a0)在Debian操作系统中的安装

起因&#xff1a;在安装了F24.8版本后&#xff0c;发现生产用环境和测试、开发用环境还是分开的好。 旧版的用来实验、测试&#xff0c;新版的一步一步小心的配置、使用是比较稳妥的操作。因此&#xff0c;决定在KVM虚拟机上搭建一个F23.2版本的企语系统。 一、 存在的问题 而…

Redis 数据类型 Hash 哈希

在 Redis 中&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如 key "key"&#xff0c;value { { field1, value1 }, ..., {fieldN, valueN } }&#xff0c;Redis String 和 Hash 类型⼆者的关系可以⽤下图来表⽰。 Hash 数据类型的特点 键值对集合…