Chainlink Core: 去中心化预言机网络的核心引擎
Chainlink Core 是驱动 Chainlink 去中心化预言机网络 的核心节点软件。它扩展了智能合约的能力,使其能够安全、可靠地访问真实世界的数据和链下计算,同时保持区块链技术固有的安全性和信任最小化保证。
该代码库包含了构建和运行 Chainlink 节点所需的核心二进制文件、智能合约接口以及跨链互操作性协议(CCIP)的实现。
功能特性
- 核心预言机节点:提供了完整的预言机节点后端实现,包括作业调度、任务执行、链上交互和数据聚合。
- 多链支持:通过统一的抽象层,原生支持 EVM、Solana、Aptos、Cosmos、Starknet 和 Tron 等多个区块链网络,实现跨链数据和价值的传输。
- 跨链互操作性协议(CCIP):实现了业界领先的 CCIP 协议,提供安全的跨链消息传递和通证转移功能。包含 Commit 和 Execute 插件,负责跨链报告的生成、验证与执行。
- 高级共识框架:集成了 OCR3(链下报告协议第3版),支持链下数据的多轮聚合与签名,显著提高数据吞吐量并降低成本。
- 可扩展的能力架构:采用模块化的“能力(Capabilities)”设计,允许动态注册和启动新的功能模块(如自动化、VRF、数据流等),并支持基于 DON(去中心化节点网络)的灵活部署。
- 安全认证机制:内置了基于 API Token 和外部初始化程序(External Initiator)的身份验证与授权机制,确保 API 访问的安全性。
安装指南
系统要求
- Go 1.23+ 版本
- PostgreSQL 数据库
- 支持的操作系统:Linux (amd64/arm64)、macOS
从源码构建
-
克隆代码库
git clone https://github.com/smartcontractkit/chainlink.git cd chainlink -
构建节点二进制文件 使用
go build命令在core目录下构建可执行文件。cd core go build -o $GOPATH/bin/chainlink .构建成功后,
chainlink二进制文件将出现在您的$GOPATH/bin目录中。
使用 Docker 运行
所有主要版本的预构建 Docker 镜像都可以在 Chainlink Docker Hub 上获取。
docker pull smartcontract/chainlink:2.27.0
docker run --rm smartcontract/chainlink:2.27.0 --help
使用说明
启动节点
初始化并启动 Chainlink 节点需要配置数据库连接和节点密钥。
# 设置环境变量
export DATABASE_URL=postgresql://postgres:password@localhost:5432/chainlink
export ETH_URL=ws://your-ethereum-node:8546
# 启动节点
chainlink node start
CLI 工具示例
Chainlink CLI 提供了节点配置、账户管理和作业操作等命令。
// 此代码片段展示了 CLI 应用的核心启动流程
// 来源: core/cmd/chainlink/main.go
package main
import (
"os"
"github.com/smartcontractkit/chainlink/v2/core"
)
func main() {
// 调用核心包的 Main 函数,该函数会解析命令行参数并运行相应的命令(如 node start, jobs create 等)
os.Exit(core.Main())
}
核心 API 概览
Chainlink 节点提供了一套完整的 RESTful API 用于远程管理:
- 作业管理:
POST /v2/jobs- 创建新的预言机作业 (Job)。 - 作业运行:
GET /v2/jobs/{jobID}/runs- 查询指定作业的运行历史。 - 桥接管理:
GET /v2/bridges- 列出已配置的外部适配器。 - 密钥管理:
POST /v2/keys/eth- 创建新的以太坊密钥。
CCIP 插件启动
对于 CCIP 能力,节点会通过 launcher 模块自动监听能力注册表 (Capabilities Registry) 的变化,并动态启动或关闭对应的 OCR3 实例。
// 简化的 CCIP 启动器逻辑,用于管理 OCR 实例的生命周期
// 来源: core/capabilities/ccip/launcher/launcher.go
func (l *launcher) transitionFrom(prevPlugins pluginRegistry) error {
// ... 省略 diff 逻辑
for digest := range currOracles.Difference(prevOracles).Iterator().C {
// 启动新配置的插件实例
if err := l.instances[donID][digest].Start(); err != nil {
return err
}
}
for digest := range prevOracles.Difference(currOracles).Iterator().C {
// 关闭已过时的插件实例
if err := prevPlugins[digest].Close(); err != nil {
return err
}
}
return nil
}
核心代码
1. API 认证 Token 管理
用于生成和验证 API 访问凭证的核心逻辑。
// 来源: core/auth/auth.go
package auth
import (
"encoding/hex"
"fmt"
"github.com/pkg/errors"
"golang.org/x/crypto/sha3"
)
// Token 用于 API 身份验证。
type Token struct {
AccessKey string `json:"accessKey"`
Secret string `json:"secret"`
}
// NewToken 生成一个新的认证 Token。
func NewToken() *Token {
return &Token{
AccessKey: utils.NewBytes32ID(), // 生成一个随机的 AccessKey
Secret: utils.NewSecret(utils.DefaultSecretSize), // 生成一个随机的 Secret
}
}
// HashedSecret 生成用于外部初始化程序认证的哈希密码。
func HashedSecret(ta *Token, salt string) (string, error) {
hasher := sha3.New256()
// 使用特定格式组合 AccessKey、Secret 和 Salt 进行哈希
input := []byte(fmt.Sprintf("v0-%s-%s-%s", ta.AccessKey, ta.Secret, salt))
if _, err := hasher.Write(input); err != nil {
return "", pkgerrors.Wrap(err, "error writing external initiator authentication to hasher")
}
return hex.EncodeToString(hasher.Sum(nil)), nil
}
2. CCIP 消息哈希器 (EVM)
用于计算跨链消息唯一哈希值,确保消息在源链和目标链之间的一致性。
// 来源: core/capabilities/ccip/ccipevm/message_hasher.go
package ccipevm
import (
"context"
"github.com/ethereum/go-ethereum/common"
"github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
"github.com/smartcontractkit/chainlink-evm/pkg/utils"
)
var (
// ANY_2_EVM_MESSAGE_HASH 是用于 Any2EVMMessage 结构的哈希前缀
ANY_2_EVM_MESSAGE_HASH = utils.Keccak256Fixed([]byte("Any2EVMMessageHashV1"))
)
// MessageHasherV1 实现了 1.6.0 版本的 CCIP 消息哈希接口。
type MessageHasherV1 struct {}
// Hash 计算给定 CCIP 消息的哈希值。
func (h *MessageHasherV1) Hash(ctx context.Context, msg ccipocr3.Message) (ccipocr3.Bytes32, error) {
// 此函数内部会执行复杂的 ABI 编码和 Keccak256 哈希计算,
// 将消息头、发送者、数据、Token 等字段组合成一个唯一的 32 字节哈希。
// 这是确保跨链消息在链上验证时不被篡改的关键步骤。
// ... (具体编码和哈希实现细节)
return [32]byte{}, nil
}
3. 跨链执行报告编码器 (EVM)
负责将 CCIP 执行插件生成的结构化报告编码为可直接提交到目标链(如 EVM)的 ABI 编码字节。
// 来源: core/capabilities/ccip/ccipevm/execute_plugin_codec.go
package ccipevm
import (
"context"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_6_0/offramp"
"github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
)
// ExecutePluginCodecV1 是 1.6.0 版本执行报告的编码器。
type ExecutePluginCodecV1 struct {
executeReportMethodInputs abi.Arguments
}
// Encode 将执行插件报告编码为字节数组,以供后续链上交易使用。
func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report ccipocr3.ExecutePluginReport) ([]byte, error) {
var evmReport []offramp.InternalExecutionReport
for _, chainReport := range report.ChainReports {
// 将通用报告结构转换为 EVM 智能合约能理解的结构
// ... (转换逻辑)
evmReport = append(evmReport, offramp.InternalExecutionReport{
SourceChainSelector: uint64(chainReport.SourceChainSelector),
Messages: messages,
Proofs: proofs,
ProofFlagBits: flagBits,
})
}
// 使用 Go ABI 库将结构体打包成字节码
return e.executeReportMethodInputs.Pack(evmReport)
}
GVT9NGsW4qUHR+TkzmCCGfSIXuvTiX0fZhRgMor5hoE=