什么是btcd?

btcd 是用 Go 语言(golang)编写的比特币替代性完整节点实现。

该项目目前正在积极开发中,处于测试版状态。它极其稳定,自 2013 年 10 月以来一直在生产环境中使用。

它使用与 Bitcoin Core 相同的精确规则(包括共识错误)下载、验证和提供区块链,接受区块的规则。我们非常小心,以避免 btcd 导致区块链分叉。它包含一个完整的区块验证测试框架,其中包含所有“官方”的区块接受测试(以及一些额外的测试),在每次拉取请求时都会运行,以确保它正确地遵循共识。此外,它通过了 Bitcoin Core 代码中的所有 JSON 测试数据。

它还正确地中继新挖掘的区块,维护交易池,并中继尚未进入区块的单个交易。它确保所有被允许进入池中的单个交易都遵循区块链要求的规则,并且还包括更严格的检查,这些检查基于矿工的要求来过滤交易(“标准”交易)。
以上信息来自btcd的官方文档

btcd 是一个用 Go 语言编写的完整比特币节点实现。它旨在为比特币网络提供一个高效、可靠且可扩展的解决方案。btcd 的主要特点包括:

  1. 去中心化:作为一个完整节点,btcd 可以独立同步整个比特币区块链,参与网络共识。
  2. 遵循比特币协议:btcd 完全遵循比特币的协议规范,使其能够与其他标准比特币节点进行无缝交互。
  3. 轻量级:相较于其他实现,btcd 更加轻量,适合于资源受限的环境。
  4. 可扩展性:btcd 设计具备良好的扩展性,允许开发者在此基础上构建新的应用和服务。
  5. 开源:btcd 是一个开源项目,任何人都可以查看、使用和贡献代码。

构建自己的BTC节点

在整个构建自己比特币钱包的过程中,我们都将使用btcd作为比特币节点。便于操作,我们使用docker来构建自己的btcd节点。

Dockerfile如下:

# Dockerfile
FROM alpine:latest AS builder
LABEL maintainer="mengbin1992@outlook.com"

WORKDIR /root

# 安装运行btcd所需的依赖项
RUN apk add --no-cache ca-certificates

RUN wget https://github.com/btcsuite/btcd/releases/download/v0.24.2/btcd-linux-amd64-v0.24.2.tar.gz && \
    tar -zxvf btcd-linux-amd64-v0.24.2.tar.gz

FROM alpine:latest 
LABEL maintainer="mengbin1992@outlook.com"

WORKDIR /root

COPY --from=builder /root/btcd-linux-amd64-v0.24.2/* /usr/local/bin

# 创建配置文件目录
RUN mkdir -p /root/.btcd

# 安装运行btcd所需的依赖项
RUN apk add --no-cache ca-certificates

# 暴露端口
EXPOSE 8333 8334

# 运行btcd
CMD ["btcd"]

docker-compose.yml如下:

networks:
  btcd:

services:
  btcd:
    image: mengbin92/btcd:0.24.2
    container_name: btcd_full_node
    volumes:
      - ./btcd:/root/.btcd
    ports:
      - 8333:8333
      - 8334:8334
    networks:
      - btcd

以测试网络为例,btcd配置文件如下:

# for txindex,构建交易索引
txindex=1
; Build and maintain a full address-based transaction index which makes the
; searchrawtransactions RPC available.
addrindex=1

# for rpcserver
rpcuser=your_rpc_user
rpcpass=your_rpc_password
rpclisten=0.0.0.0:8334

# test,连接测试网
testnet=1

关于btcd的更多配置信息,可以参考官方文档

连接到比特币网络

下面是使用golang连接btcd的示例代码:

package main

import (
	"fmt"
	"os"
	"github.com/btcsuite/btcd/rpcclient"
)

var (
	rpcuser  = "default"
	rpcpass  = "default"
	endpoint = "localhost:8334"
	rpccert  = "./btcd/rpc.cert"
	keypath  = "./keys/private.key"
)

var (
	client *rpcclient.Client
)

func main() {
	cert, err := os.ReadFile(rpccert)
	if err != nil {
		panic(err)
	}

	connCfg := &rpcclient.ConnConfig{
		Host:         endpoint,
		User:         rpcuser,
		Pass:         rpcpass,
		HTTPPostMode: true,
		Certificates: cert,
	}

	client, err = rpcclient.New(connCfg, nil)
	if err != nil {
		panic(err)
	}
	defer client.Shutdown()

	bc,err := client.GetBlockCount()
	if err != nil{
		panic(err)
	}
	fmt.Printf("block count: %d\n",bc)
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特