{"id":13772812,"url":"https://github.com/mappum/bitcoin-protocol","last_synced_at":"2025-04-19T17:54:14.364Z","repository":{"id":3810237,"uuid":"50975027","full_name":"mappum/bitcoin-protocol","owner":"mappum","description":":symbols: Bitcoin network protocol streams","archived":false,"fork":false,"pushed_at":"2022-12-09T08:56:01.000Z","size":1143,"stargazers_count":14,"open_issues_count":15,"forks_count":13,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-18T13:00:16.447Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mappum.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-03T04:56:14.000Z","updated_at":"2025-03-30T00:42:30.000Z","dependencies_parsed_at":"2023-01-11T16:33:28.035Z","dependency_job_id":null,"html_url":"https://github.com/mappum/bitcoin-protocol","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mappum%2Fbitcoin-protocol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mappum%2Fbitcoin-protocol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mappum%2Fbitcoin-protocol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mappum%2Fbitcoin-protocol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mappum","download_url":"https://codeload.github.com/mappum/bitcoin-protocol/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249753443,"owners_count":21320689,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T17:01:08.100Z","updated_at":"2025-04-19T17:54:14.345Z","avatar_url":"https://github.com/mappum.png","language":"JavaScript","readme":"# bitcoin-protocol\n\n[![npm version](https://img.shields.io/npm/v/bitcoin-protocol.svg)](https://www.npmjs.com/package/bitcoin-protocol)\n[![Build Status](https://travis-ci.org/mappum/bitcoin-protocol.svg?branch=master)](https://travis-ci.org/mappum/bitcoin-protocol)\n[![Dependency Status](https://david-dm.org/mappum/bitcoin-protocol.svg)](https://david-dm.org/mappum/bitcoin-protocol)\n\n**Bitcoin network protocol streams**\n\nThis module encodes and decodes low-level network protocol data using streams.\n\nYou may want a higher-level module like [bitcoin-net](https://github.com/mappum/bitcoin-net/), which some things for you such as connection handshakes, sending keepalive pings, etc.\n\n## Usage\n\n`npm install bitcoin-protocol`\n\n```js\nvar net = require('net')\nvar bp = require('bitcoin-protocol')\n\nvar decoder = bp.createDecodeStream()\ndecoder.on('data', function (message) { console.log(message) })\n\nvar encoder = bp.createEncodeStream()\n\nvar socket = net.connect(8333, '127.0.0.1', function () {\n  socket.pipe(decoder)\n  encoder.pipe(socket)\n\n  encoder.write({\n    magic: 0xd9b4bef9,\n    command: 'version',\n    payload: {\n      version: 70012,\n      services: Buffer(8).fill(0),\n      timestamp: Math.round(Date.now() / 1000),\n      receiverAddress: {\n        services: Buffer('0100000000000000', 'hex'),\n        address: '0.0.0.0',\n        port: 8333\n      },\n      senderAddress: {\n        services: Buffer(8).fill(0),\n        address: '0.0.0.0',\n        port: 8333\n      },\n      nonce: Buffer(8).fill(123),\n      userAgent: 'foobar',\n      startHeight: 0,\n      relay: true\n    }\n  })\n})\n```\n\n### Methods\n\n#### `createDecodeStream([opts])`\n\nCreates a stream which parses raw network bytes written to it and outputs message objects.\n\nOpts may contain:\n```js\n{\n  magic: Number\n  // If provided, the decoder will check if messages' \"magic\" field matches\n  // this value. If it does not match, the stream will emit an error.\n}\n```\n\n#### `createEncodeStream([opts])`\n\nCreates a stream which encodes message objects to raw network bytes.\n\nOpts may contain:\n```js\n{\n  magic: Number\n  // If provided, the encoder will automatically add the \"magic\" field to each\n  // message written to it.\n}\n```\n\n### Format\n\n**Decoder**\n\nEmitted by the decoder:\n```js\n{\n  magic: Number,\n  command: String,\n  length: Number,\n  checksum: Buffer, // 8 bytes,\n  payload: Object // see below for detailed payload formats\n}\n```\n\n**Encoder**\n\nWritten to the encoder:\n```js\n{\n  magic: Number, // optional if you set this in the options\n  command: String,\n  payload: Object // see below for detailed payload formats\n}\n```\n\n### Payload Reference\n\nThe formats for the objects used as message payloads for the various commands are as follows. See [the wiki](https://en.bitcoin.it/wiki/Protocol_documentation) for more information about these messages.\n\n#### `version`\n```js\n{\n  version: Number,\n  services: Buffer, // 8 bytes\n  timestamp: Number,\n  receiverAddress: {\n    services: Buffer, // 8 bytes\n    address: String, // ipv4 or ipv6\n    port: Number\n  },\n  senderAddress: {\n    services: Buffer, // 8 bytes\n    address: String, // ipv4 or ipv6\n    port: Number\n  },\n  nonce: Buffer, // 8 bytes\n  userAgent: String,\n  startHeight: Number,\n  relay: Boolean\n}\n```\n\n#### `verack`, `getaddr`, `mempool`, `filterclear`, `sendheaders`\n```js\n// no payload needed\n```\n\n#### `addr`\n```js\n[\n  {\n    time: Number,\n    services: Buffer, // 8 bytes\n    address: String, // ipv4 or ipv6\n    port: Number\n  },\n  ...\n]\n```\n\n#### `inv`, `getdata`, `notfound`\n```js\n[\n  {\n    type: Number,\n    hash: Buffer // 32 bytes\n  },\n  ...\n]\n```\n\n#### `getblocks`, `getheaders`\n```js\n{\n  version: Number,\n  locator: [\n    Buffer // 32 bytes\n  ],\n  hashStop: Buffer // 32 bytes\n}\n```\n\n#### `tx`\n```js\n{\n  version: Number,\n  ins: [\n    {\n      hash: Buffer, // 32 bytes\n      index: Number,\n      script: Buffer, // varying length\n      sequence: Number\n    },\n    ...\n  ],\n  outs: [\n    {\n      value: BN, // from 'bn.js' package\n      script: Buffer // varying length\n    },\n    ...\n  ],\n  locktime: Number\n}\n```\n\n#### `block`\n```js\n{\n  header: {\n    version: Number,\n    prevHash: Buffer, // 32 bytes\n    merkleRoot: Buffer, // 32 bytes\n    timestamp: Number,\n    bits: Number,\n    nonce: Number,\n  },\n  transactions: [\n    {}, // same format as 'tx' message\n    ...\n  ]\n}\n```\n\n#### `headers`\n```js\n[\n  {\n    header: {\n      version: Number,\n      prevHash: Buffer, // 32 bytes\n      merkleRoot: Buffer, // 32 bytes\n      timestamp: Number,\n      bits: Number,\n      nonce: Number,\n    },\n    nTransactions: Number\n  },\n  ...\n]\n```\n\n#### `ping`, `pong`\n```js\n{\n  nonce: Buffer // 8 bytes\n}\n```\n\n#### `reject`\n```js\n{\n  message: String,\n  ccode: Number,\n  reason: String,\n  data: Buffer // varying length\n}\n```\n\n#### `filterload`\n```js\n{\n  data: Buffer, // varying length\n  nHashFuncs: Number,\n  nTweak: Number,\n  nFlags: Number\n}\n```\n\n#### `filteradd`\n```js\n{\n  data: Buffer // varying length\n}\n```\n\n#### `merkleblock`\n```js\n{\n  header: {\n    version: Number,\n    prevHash: Buffer, // 32 bytes\n    merkleRoot: Buffer, // 32 bytes\n    timestamp: Number,\n    bits: Number,\n    nonce: Number\n  },\n  numTransactions: Number,\n  hashes: [\n    Buffer // 32 bytes\n  ],\n  flags: Buffer // varying length\n}\n```\n\n#### `alert`\n```js\n{\n  payload: Buffer, // varying length\n  signature: Buffer // varying length\n}\n```\n","funding_links":[],"categories":["List of content"],"sub_categories":["P2P"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmappum%2Fbitcoin-protocol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmappum%2Fbitcoin-protocol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmappum%2Fbitcoin-protocol/lists"}