什么是btcd?
btcd 是用 Go 语言(golang)编写的比特币替代性完整节点实现。
该项目目前正在积极开发中,处于测试版状态。它极其稳定,自 2013 年 10 月以来一直在生产环境中使用。
它使用与 Bitcoin Core 相同的精确规则(包括共识错误)下载、验证和提供区块链,接受区块的规则。我们非常小心,以避免 btcd 导致区块链分叉。它包含一个完整的区块验证测试框架,其中包含所有“官方”的区块接受测试(以及一些额外的测试),在每次拉取请求时都会运行,以确保它正确地遵循共识。此外,它通过了 Bitcoin Core 代码中的所有 JSON 测试数据。
它还正确地中继新挖掘的区块,维护交易池,并中继尚未进入区块的单个交易。它确保所有被允许进入池中的单个交易都遵循区块链要求的规则,并且还包括更严格的检查,这些检查基于矿工的要求来过滤交易(“标准”交易)。
以上信息来自btcd的官方文档。
btcd 是一个用 Go 语言编写的完整比特币节点实现。它旨在为比特币网络提供一个高效、可靠且可扩展的解决方案。btcd 的主要特点包括:
- 去中心化:作为一个完整节点,btcd 可以独立同步整个比特币区块链,参与网络共识。
- 遵循比特币协议:btcd 完全遵循比特币的协议规范,使其能够与其他标准比特币节点进行无缝交互。
- 轻量级:相较于其他实现,btcd 更加轻量,适合于资源受限的环境。
- 可扩展性:btcd 设计具备良好的扩展性,允许开发者在此基础上构建新的应用和服务。
- 开源: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: 恋水无意
腾讯云开发者社区:孟斯特