艾达币私链搭建指南:从零开始构建你的 Cardano 实验环境
Cardano,作为第三代区块链的代表,以其严谨的学术理论基础、Haskell 编程语言的安全性以及独特的 Ouroboros 权益证明机制而闻名。对于开发者而言,理解 Cardano 的底层运作机制,并能够在隔离的环境中进行实验,至关重要。本指南将引导你一步步搭建一个艾达币 (ADA) 的私有链,用于开发、测试以及深入研究 Cardano 的技术特性。
准备工作
在开始搭建以太坊私有链之前,请务必确认已经满足以下先决条件,这将有助于确保搭建过程的顺利进行:
- Linux 服务器或虚拟机: 为了获得最佳兼容性和稳定性,推荐使用 Ubuntu 20.04 LTS (长期支持版本) 或更高版本。其他 Linux 发行版,例如 Debian、CentOS 等,也可以使用,但可能需要针对特定发行版进行一些配置上的调整。确保服务器或虚拟机具备足够的资源,例如至少 2GB 的内存和 20GB 的存储空间,以满足以太坊节点的运行需求。
- Docker 和 Docker Compose: Docker 提供了一个容器化的环境,可以简化以太坊私有链的部署过程。Docker Compose 则允许你使用 YAML 文件定义和管理多个 Docker 容器,简化了多节点私有链的配置。你需要安装 Docker Engine 和 Docker Compose。可以通过官方文档获取详细的安装步骤,针对不同的 Linux 发行版,安装方法略有差异。使用 Docker 可以避免手动安装和配置以太坊客户端及其依赖项,减少潜在的冲突和错误。
-
基本的 Linux 命令行操作知识:
搭建私有链涉及一系列的命令行操作,例如创建目录 (
mkdir
)、切换目录 (cd
)、编辑文件 (nano
或vim
)、查看文件内容 (cat
)、执行脚本 (./script.sh
) 等。掌握这些基本命令将使你能够有效地管理服务器、配置节点和部署智能合约。对于不熟悉的命令,可以使用man 命令名
命令查看帮助文档。 - 耐心和探索精神: 搭建以太坊私有链是一个涉及多个组件和配置的过程,可能会遇到各种意想不到的问题。例如,端口冲突、配置错误、网络连接问题等。遇到问题时,不要灰心,仔细阅读错误信息、查阅相关文档、搜索解决方案。具备耐心和积极的探索精神是成功搭建私有链的关键。善用搜索引擎和社区资源,例如 Stack Overflow、以太坊官方论坛等,可以帮助你快速找到解决方案。
搭建步骤
1. 获取 Cardano Node Docker 镜像
你需要从 Docker Hub 拉取 Cardano 节点的 Docker 镜像。尽管官方提供了镜像,但为了更灵活地搭建和配置私有链,通常会选择定制化的镜像。
inputoutput/cardano-node
镜像是一个常用的选择,它提供了基础的 Cardano 节点功能,并且相对容易进行私链配置。当然,你也可以根据项目需求,选择其他的 Docker 镜像。
使用 Docker CLI 命令来拉取镜像:
docker pull inputoutput/cardano-node:latest
此命令会从 Docker Hub 下载标记为 `latest` 的
inputoutput/cardano-node
镜像到你的本地环境。镜像文件体积较大,下载时间取决于你的网络速度。下载完成后,你可以使用
docker images
命令来验证镜像是否已成功下载。如果需要指定特定版本的镜像,可以将 `latest` 替换为相应的 Tag,例如 `inputoutput/cardano-node:1.35.4` 。
2. 创建 Docker Compose 文件
接下来,需要创建一个
docker-compose.yml
文件,此文件用于详细定义 Cardano 节点服务的运行配置,包括镜像选择、端口映射、数据卷挂载、环境变量设置和启动命令等。
docker-compose
工具将根据此文件自动化构建和运行 Cardano 节点容器。
以下是一个
docker-compose.yml
文件的示例,此示例针对 Cardano 测试网络进行了优化:
version: "3.9"
services:
cardano-node:
image: inputoutput/cardano-node:latest
container_name: cardano-node
ports:
- "3001:3001" # 映射端口 3001,允许外部连接到节点
volumes:
- ./node-data:/data # 将宿主机的 ./node-data 目录挂载到容器的 /data 目录
environment:
- CARDANO_NETWORK=testnet # 设置 CARDANO_NETWORK 环境变量为 testnet,连接到 Cardano 测试网络
command:
- "run" # 运行命令
- "--config" # 指定配置文件路径
- "/data/config." # 配置文件路径
- "--topology" # 指定拓扑文件路径
- "/data/topology." # 拓扑文件路径
- "--database-path" # 指定数据库路径
- "/data/db" # 数据库路径
- "--socket-path" # 指定节点socket文件路径,用于节点间通信
- "/data/node.socket" # 节点socket文件路径
restart: on-failure # 如果容器启动失败,则自动重启
此
docker-compose.yml
文件定义了一个名为
cardano-node
的服务。
image
字段指定使用的 Docker 镜像为
inputoutput/cardano-node:latest
,确保使用最新的 Cardano 节点版本。
container_name
字段指定容器的名称为
cardano-node
,方便后续管理。
ports
字段将宿主机的 3001 端口映射到容器的 3001 端口,允许外部应用连接到 Cardano 节点。
volumes
字段将宿主机的
./node-data
目录挂载到容器的
/data
目录,用于持久化存储 Cardano 节点的配置文件、区块链数据、密钥和其他重要数据。
environment
字段设置环境变量
CARDANO_NETWORK
为
testnet
,指示节点连接到 Cardano 测试网络,测试网络提供了一个安全的实验环境,避免使用真实资金。
command
字段定义了容器启动时执行的命令,包括
run
(运行节点)、
--config
(指定配置文件)、
--topology
(指定拓扑文件)、
--database-path
(指定数据库路径)和
--socket-path
(指定节点 Socket 文件路径)等参数。 配置文件 (
config.
) 定义了节点的全局设置,拓扑文件 (
topology.
) 定义了节点与其他节点之间的连接方式,数据库路径 (
/data/db
) 定义了区块链数据的存储位置,节点 Socket 文件 (
/data/node.socket
) 用于节点与其他进程(例如
cardano-cli
)之间的通信。
restart: on-failure
指令确保在容器意外崩溃时自动重启。
3. 生成配置文件
Cardano 节点需要一系列配置文件才能启动并正常参与网络运行。这些配置文件定义了节点行为的关键参数,并使节点能够与其他节点进行通信和验证交易。以下是搭建私有 Cardano 区块链所需的关键配置文件:
- config.: 这是节点的核心配置文件,包含了网络参数,例如协议版本、区块大小限制、数据库路径、日志设置以及其他影响节点行为的关键配置。此文件对于节点的正常运行至关重要。
- topology.: 此文件定义了节点将连接到的其他节点,有效地描述了网络的拓扑结构。它指定了对等节点的地址和端口信息,使节点能够发现并连接到网络中的其他参与者。在私有链环境中,这通常指向网络中的其他节点,或指向自身以进行单节点测试。
- genesis.: 创世文件定义了区块链的初始状态。它包含了初始 ADA 分配、共识参数(例如 epoch 长度和安全参数)以及其他决定区块链初始配置的关键设置。创世文件对于网络的启动至关重要,因为它定义了区块链的规则和经济模型。
由于您正在搭建一个私有链,您需要自定义这些配置文件以满足您的特定需求。私有链允许您控制网络的参数,并根据您的实验或开发目标对其进行调整。
创建
node-data
目录:
mkdir node-data
cd node-data
此目录将用于存储所有配置文件。使用
mkdir
命令创建目录,然后使用
cd
命令导航到该目录。
使用文本编辑器(例如
nano
、
vim
或任何您喜欢的文本编辑器)创建
config.
文件。 以下是一个示例,您可以根据需要对其进行自定义:
{
"AlonzoGenesisFile": "genesis.",
"AlonzoGenesisHash": "genesisHash",
"ByronGenesisFile": "genesis.",
"ByronGenesisHash": "genesisHash",
"ShelleyGenesisFile": "genesis.",
"ShelleyGenesisHash": "genesisHash",
"EnableP2P": false,
"EnableMempoolP2P": false,
"TraceBlockFetchDecisions": true,
"TraceBlockFetchProtocol": true,
"TraceBlockFetchClient": true,
"TraceBlockFetchServer": true,
"TraceChainSyncProtocol": true,
"TraceChainSyncClient": true,
"TraceChainSyncServer": true,
"TraceTxSubmissionProtocol": true,
"TraceTxSubmissionClient": true,
"TraceTxSubmissionServer": true,
"TestEnableDevelopmentNetworkOnly": true,
"LastKnownBlockVersion-Major": 1,
"LastKnownBlockVersion-Minor": 0,
"LastKnownBlockVersion-Alt": 0,
"defaultBackends": [
"KatipStdout"
],
"LoggingOn": true,
"LogMetrics": true,
"TurnOnLogMetrics": true,
"StdoutSeverity": "Notice",
"setupBackends": [
"KatipStdout"
]
}
这个
config.
文件指定了创世文件的名称和哈希值,并启用了一些调试选项,以便进行故障排除。
TestEnableDevelopmentNetworkOnly
设置为
true
,表明节点仅允许连接到开发网络,防止意外连接到主网或测试网。 其他配置选项控制日志记录和跟踪行为。 请注意,
genesisHash
字段需要设置为您生成的创世块的实际哈希值,才能使节点正确验证区块链。
创建
topology.
文件:
{
"Producers": [
{
"addr": "127.0.0.1",
"port": 3001,
"valency": 1
}
]
}
此
topology.
文件定义了一个生产者节点。
addr
字段设置为
127.0.0.1
(localhost),
port
字段设置为
3001
。
valency
字段指定了要连接到该节点的连接数。由于您正在搭建一个单节点私有链,因此节点将连接到自身。在多节点网络中,您需要在此文件中指定其他节点的地址和端口信息。端口
3001
是一个常用的 Cardano 节点端口,但可以根据需要进行配置。
创建
genesis.
文件:
{
"startTime": "2024-10-27T00:00:00Z",
"systemStart": 0,
"nPraosActiveSlotsCoeff": 0.1,
"securityParam": 10,
"epochLength": 300,
"slotsPerKESPeriod": 129600,
"maxKESEvolutions": 0,
"slotLength": 1,
"updateQuorum": 1,
"maxLovelaceSupply": 45000000000000000,
"protocolParams": {
"protocolVersion": {
"major": 8,
"minor": 0
},
"minFeeA": 44,
"minFeeB": 155381,
"maxBlockBodySize": 65536,
"maxTransactionSize": 16384,
"maxBlockHeaderSize": 1100,
"keyDeposit": "2000000",
"poolDeposit": "500000000",
"eMax": 18,
"nOpt": 150,
"a0": 0.3,
"rho": 0.001,
"tau": 0.95,
"decentralisationParam": 1,
"extraEntropy": null,
"costModels": {},
"executionCosts": {
"plutusV1": null,
"plutusV2": null
},
"maxTxExUnits": {
"mem": 10000000,
"steps": 10000000000
},
"maxBlockExUnits": {
"mem": 50000000,
"steps": 40000000000
},
"maxValSize": 5000,
"collateralPercentage": 150,
"maxCollateralInputs": 3
},
"genDelegs": {},
"initialFunds": [],
"initialStaking": {}
}
此
genesis.
文件定义了私有链的初始状态和关键参数。
startTime
字段设置区块链启动的时间。
systemStart
字段代表系统启动的 Unix 时间戳。
nPraosActiveSlotsCoeff
,
securityParam
,
epochLength
,
slotsPerKESPeriod
和
maxKESEvolutions
等参数控制着共识机制的行为。
maxLovelaceSupply
字段定义了 ADA 的总供应量(以 Lovelace 为单位)。
protocolParams
包含影响交易费用、区块大小和其他协议级行为的各种参数。务必仔细配置这些参数,因为它们会显著影响区块链的性能和安全性。请特别注意
protocolVersion
字段,该字段必须与您所使用的 Cardano 节点版本兼容。不匹配的版本可能导致节点启动失败或出现意外行为。
initialFunds
字段用于分配初始 ADA,您可以稍后手动修改此字段以添加初始资金分配。
initialStaking
字段用于配置初始权益池,此处也可以留空。
4. 启动 Cardano 节点
在成功创建并正确配置
docker-compose.yml
文件后,下一步是启动 Cardano 节点。 确保您当前的工作目录是包含
docker-compose.yml
文件的目录。然后,执行以下
docker-compose
命令来启动节点:
docker-compose up -d
上述命令将启动在
docker-compose.yml
文件中定义的 Cardano 节点容器,并将其置于后台运行模式(
-d
参数代表 detached mode)。 这意味着节点将在后台持续运行,而不会阻塞您的终端。
为了监控节点的状态和进展,可以使用
docker logs
命令查看节点的日志输出。 使用以下命令实时追踪
cardano-node
容器的日志:
docker logs cardano-node -f
-f
参数 (follow) 使
docker logs
命令能够持续输出新的日志条目。 通过查看日志,您可以了解节点是否正在同步区块链、是否有任何错误发生,以及节点的整体运行状况。 请注意,首次启动节点时,同步区块链可能需要相当长的时间,具体时间取决于您的网络速度和硬件性能。
5. 生成 Genesis Hash
节点成功启动后,为了确保节点与其他网络参与者在同一区块链上运行,必须获取创世 (Genesis) 文件的哈希值。此哈希值充当区块链的指纹,用于验证节点的链数据与网络的其余部分是否一致。获取此哈希值并将正确的值配置到节点的配置文件中是至关重要的步骤。
可以使用以下命令从正在运行的 Cardano 节点容器中提取创世哈希:
docker exec cardano-node cardano-cli genesis hash --genesis-file /data/genesis.
这条命令的解释如下:
-
docker exec cardano-node
: 这部分命令指示 Docker 在名为cardano-node
的容器内部执行命令。 -
cardano-cli genesis hash
:这部分命令调用 Cardano 命令行界面 (CLI) 的genesis hash
子命令,专门用于计算创世文件的哈希值。 -
--genesis-file /data/genesis.
:此选项指定创世文件的路径,在这种情况下,假定它位于容器内的/data/genesis.
。请注意,实际文件名和路径可能因您的设置而异。
执行此命令后,它将输出一个唯一的哈希值,该哈希值代表您的特定创世文件。该哈希值必须准确地复制到您的 Cardano 节点配置文件 (
config.
) 中的相应字段。
您需要将生成的哈希值更新到
config.
文件的以下三个字段中,确保网络正确同步和操作:
-
"AlonzoGenesisHash"
:Alonzo 创世哈希,用于指示 Alonzo 时代的创世区块哈希。 -
"ByronGenesisHash"
:Byron 创世哈希,用于指示 Byron 时代的创世区块哈希。 -
"ShelleyGenesisHash"
:Shelley 创世哈希,用于指示 Shelley 时代的创世区块哈希。
重要提示:
确保精确复制哈希值至关重要。任何细微的错误都可能导致节点无法正确连接到网络,并导致同步问题。仔细检查您输入的值,并验证它们是否与
cardano-cli
命令输出的值完全匹配。
正确配置这些哈希值后,您的 Cardano 节点将能够成功地与其他网络参与者同步,并参与到区块链的操作中。
6. 与私链交互
私有链成功部署后,
cardano-cli
工具成为与该链互动的主要途径。 通过此工具,可以执行包括创建钱包、发起交易、查询账户余额等关键操作。 要启用此功能,必须将
cardano-cli
工具安装到本地计算机上,并正确配置与私有链的连接参数,确保工具能够安全可靠地与链进行通信。
首要步骤是从运行 Cardano 节点的 Docker 容器中复制
node.socket
文件到本地文件系统。 此文件是
cardano-cli
工具与私有链节点建立通信的关键。 使用以下 Docker 命令执行复制操作:
bash
docker cp cardano-node:/data/node.socket ./node.socket
接下来,需要配置
CARDANO_NODE_SOCKET_PATH
环境变量。 此变量必须指向刚刚复制到本地的
node.socket
文件的完整路径。 通过设置此环境变量,
cardano-cli
工具才能找到并连接到私有链节点。 使用以下命令设置环境变量:
bash
export CARDANO_NODE_SOCKET_PATH=$(pwd)/node.socket
完成上述配置后,现在可以使用
cardano-cli
工具与私有链进行交互。 例如,可以使用以下命令创建一个新的钱包地址。 这涉及到生成一个用于签名的私钥文件和一个用于验证的公钥文件:
bash
cardano-cli address key-gen \
--signing-key-file payment.skey \
--verification-key-file payment.vkey
创建密钥对后,需要使用公钥构建一个 Cardano 地址。 该地址将用于接收和发送 ADA 代币。
--testnet-magic
参数需要与
genesis.
文件中配置的网络魔数相匹配,确保地址与私有链的网络兼容:
bash
cardano-cli address build \
--payment-verification-key-file payment.vkey \
--out-file payment.addr \
--testnet-magic 42 # 或者使用 genesis. 中定义的 testnet magic
执行上述命令后,将生成一个名为
payment.addr
的文件,其中包含新创建的 Cardano 地址。 此地址可用于接收和发送 ADA 代币,参与私有链上的交易活动。
搭建私有链后,可以创建一个隔离的实验环境,用于探索 Cardano 的各种功能和特性。 可以在此环境中安全地测试智能合约、研究共识机制、调整网络参数等,而无需担心对主网或测试网造成任何影响。 这种实践性的学习方式有助于深入理解 Cardano 的技术原理,并为开发 Cardano 应用程序奠定坚实的基础。 还可以利用私有链模拟各种网络条件和攻击场景,从而提高应用程序的安全性和可靠性。