名称: junglebus 描述: 这个技能应在用户询问关于“JungleBus”、“交易流式传输”、“BSV订阅”、“实时区块链数据”、“GorillaPool API”或需要订阅区块链事件时使用。
JungleBus
来自GorillaPool的实时BSV区块链数据流式传输。索引所有比特币交易,并特别处理数据协议。
何时使用
- 订阅匹配特定模式的交易
- 流式传输实时内存池和区块数据
- 构建索引器或通知系统
- 监控地址或脚本模式
- 追踪1Sat Ordinals、MAP、BAP等协议
创建订阅
逐步指南(仪表板)
- 访问 https://junglebus.gorillapool.io
- 登录或创建账户
- 导航:仪表板 > 订阅 > 创建新订阅
- 填写订阅详情:
- ID:自动生成的唯一标识符
- 名称:订阅的描述性名称
- 描述:此订阅监控的内容
订阅过滤器
使用AND逻辑定义要捕获的交易(所有条件必须匹配):
| 过滤器 | 描述 | 示例 |
|---|---|---|
| 地址 | 逗号分隔的比特币地址 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
| 输入类型 | 输入脚本类型 | ordlock, sigil |
| 输出类型 | 输出分类 | aip, bap, bitcom, map, ord, run, token_stas, pubkeyhash, nulldata |
| 上下文 | 来自OP_RETURN输出的主要数据 | 协议特定标识符 |
| 子上下文 | 来自输出的次要数据 | 取决于输出类型 |
| 数据键 | 交易中的键值对 | app=junglebus, type=post |
注意:单个字段中的多个值使用AND逻辑——所有值必须在交易中出现。
常见订阅模式
监控1Sat Ordinals:
- 输出类型:
ord - 上下文:
image/png,text/plain(内容类型)
监控BAP身份:
- 输出类型:
bap - 上下文:
1BAPSuaPnfGnSBM3GLV9yhxUdYe4vGbdMT(BAP地址)
监控MAP协议:
- 输出类型:
map - 上下文:
1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5(MAP前缀)
监控特定地址:
- 地址:
1YourAddressHere
JavaScript客户端
安装
npm install @gorillapool/js-junglebus
基本用法
import { JungleBusClient, ControlMessageStatusCode } from '@gorillapool/js-junglebus';
const client = new JungleBusClient("junglebus.gorillapool.io", {
useSSL: true,
onConnected(ctx) {
console.log("已连接", ctx);
},
onConnecting(ctx) {
console.log("连接中", ctx);
},
onDisconnected(ctx) {
console.log("已断开", ctx);
},
onError(ctx) {
console.error("错误", ctx);
}
});
// 订阅订阅ID
const subscriptionId = "您的订阅ID";
const fromBlock = 750000;
client.Subscribe(
subscriptionId,
fromBlock,
(tx) => {
// 接收已确认交易
console.log("交易:", tx.id, "在高度", tx.block_height);
console.log("输出类型:", tx.output_types);
console.log("上下文:", tx.contexts);
},
(status) => {
// 状态更新
if (status.statusCode === ControlMessageStatusCode.BLOCK_DONE) {
console.log("区块完成:", status.block);
} else if (status.statusCode === ControlMessageStatusCode.WAITING) {
console.log("等待新区块...");
} else if (status.statusCode === ControlMessageStatusCode.REORG) {
console.log("重组触发:", status);
}
},
(error) => {
// 订阅错误
console.error("订阅错误:", error);
},
(mempoolTx) => {
// 未确认内存池交易
console.log("内存池交易:", mempoolTx.id);
}
);
轻量模式(低带宽)
// 最后一个参数 = true 表示轻量模式
client.Subscribe(
subscriptionId,
fromBlock,
onTx,
onStatus,
onError,
onMempool,
true // 轻量模式 - 仅交易ID和区块高度
);
交易数据格式
完整交易对象
{
"id": "e597af34eb78b599b7d458110a3cc602a40dedd020db684992b40926217612a4",
"block_hash": "000000000000000006296f1e5437dd6c01b9b5471691a89a9c7d8e9f06920da5",
"block_height": 750000,
"block_time": 1658878267,
"block_index": 3,
"transaction": "0100000002...",
"merkle_proof": "AAOkEnYhJgm0kklo2yDQ7Q2kAsY8ChFY1LeZtXjrNK+X...",
"addresses": [
"18FJd9tDLAC2S6PCzfnqNfUMXhZuPfsFUm",
"1P7UWRLdL5pH2Si1GauwASYAA1LQHs2z45"
],
"inputs": [],
"outputs": [
"76a9144f7d6a485e09770f947c0ba38d15050a5a80b6fa88ac",
"76a914f28c3992dd6a43eccaed16f3f7fb6ac8da1bc3c288ac"
],
"input_types": [],
"output_types": ["nulldata", "pubkeyhash", "run"],
"contexts": [
"555aad1953bcfef8c7779d246fa03efae0412ed700b955435831814f5be3a82b_o1",
"c2c4c971e85b499c29a8ab2148fd324fe12b550b8f4f57658a4686e011d8fd58_o1"
],
"sub_contexts": [
"2e729d39a9cd300f5100044a54204e6d8b43fe49555309361fdc3d8565323499"
],
"data": []
}
字段描述
| 字段 | 类型 | 描述 |
|---|---|---|
id |
字符串 | 交易ID(txid) |
block_hash |
字符串 | 交易被挖掘的区块哈希 |
block_height |
数字 | 区块高度 |
block_time |
数字 | Unix时间戳 |
block_index |
数字 | 交易在区块中的位置 |
transaction |
字符串 | 完整的十六进制交易 |
merkle_proof |
字符串 | TSC兼容的二进制默克尔证明 |
addresses |
字符串数组 | 交易中找到的所有地址 |
outputs |
字符串数组 | 输出脚本(限制为1024字符) |
output_types |
字符串数组 | 分类(aip、bap、map、ord等) |
contexts |
字符串数组 | 来自OP_RETURN输出的主要数据 |
sub_contexts |
字符串数组 | 来自输出的次要数据 |
data |
字符串数组 | 其他键值对属性 |
支持的协议
JungleBus自动识别和索引这些协议:
| 协议 | 输出类型 | 上下文 | 描述 |
|---|---|---|---|
| 1Sat输出 | 1sat |
无 | 1聪输出 |
| 1Sat Ordinals | ord |
内容类型 | 带有内容类型的铭文 |
| AIP | aip |
协议数据 | 比特币认证协议 |
| B协议 | b |
协议数据 | B://文件存储 |
| BAP | bap |
1BAPSuaPnfGnSBM3GLV9yhxUdYe4vGbdMT |
BAP身份 |
| Bitcom | bitcom |
协议数据 | Bitcom协议 |
| Boost | boost |
协议数据 | Boost POW |
| MAP | map |
1PuQa7K62MiKCtssSLKy1kh56WWU7MtUR5 |
MAP协议 |
| Run | run |
协议数据 | Run代币 |
| STAS | token_stas |
协议数据 | STAS代币 |
REST API端点
获取交易
curl https://junglebus.gorillapool.io/v1/transaction/get/{txid}
返回带解析数据的完整交易。
获取地址历史
curl https://junglebus.gorillapool.io/v1/address/get/{address}
返回:
[
{
"id": "8859250950ecbb7025731c1206e277e344a6db5f285274b7a1d2817980ab8e64",
"address": "13qRymPwRxAr7oRdAoFdo5Wp8815sstHE5",
"transaction_id": "eb197a43a7c4ed230a7125d7e7bf5990cd60be8ff0f59b8fffdfd91d52dfce82",
"block_hash": "0000000000000000002be95240df5e4215e6878259dce8b9df08650641fdd40a",
"block_index": 50545
}
]
获取区块头
curl https://junglebus.gorillapool.io/v1/block_header/get/{block_hash}
返回:
{
"hash": "000000000000000006296f1e5437dd6c01b9b5471691a89a9c7d8e9f06920da5",
"coin": 1,
"height": 750000,
"time": 1658878267,
"nonce": 4188280238,
"version": 671080448,
"merkleroot": "e88b40ac9367eb11dd918416b668e67f09bf24550eac93de7f2d68a0ca0c6eae",
"bits": "180f4e90",
"synced": 8971
}
控制消息状态代码
import { ControlMessageStatusCode } from '@gorillapool/js-junglebus';
// 可用代码:
ControlMessageStatusCode.BLOCK_DONE // 区块处理完成
ControlMessageStatusCode.WAITING // 等待新区块
ControlMessageStatusCode.REORG // 区块链重组
ControlMessageStatusCode.ERROR // 发生错误
Go客户端
go get github.com/GorillaPool/go-junglebus
package main
import (
"github.com/GorillaPool/go-junglebus"
)
func main() {
client, _ := junglebus.New(
junglebus.WithHTTP("https://junglebus.gorillapool.io"),
)
client.Subscribe("subscription-id", 750000, func(tx *junglebus.Transaction) {
fmt.Printf("TX: %s at height %d
", tx.Id, tx.BlockHeight)
fmt.Printf("Types: %v
", tx.OutputTypes)
})
}
JungleBus vs WhatsOnChain
| 特性 | JungleBus | WhatsOnChain |
|---|---|---|
| 实时流式传输 | ✅ 是 | ❌ 否 |
| 交易历史 | ✅ 是 | ✅ 是 |
| 地址余额 | ❌ 否 | ✅ 是 |
| UTXOs | ❌ 否 | ✅ 是 |
| 价格数据 | ❌ 否 | ✅ 是 |
| 解析交易数据 | ✅ 是 | ⚠️ 有限 |
| 协议索引 | ✅ 是 | ❌ 否 |
使用JungleBus用于:流式传输、协议监控、实时索引 使用WhatsOnChain用于:余额、UTXOs、价格数据
仪表板工作流程
junglebus.gorillapool.io
↓
仪表板 → 订阅 → 创建新订阅
↓
配置过滤器:
- 地址(可选)
- 输入类型(可选)
- 输出类型(协议过滤必需)
- 上下文(特定协议必需)
- 子上下文(可选)
- 数据键(可选)
↓
保存订阅
↓
复制订阅ID
↓
在代码中使用