主题
cbdc-biz/app/issuer
发行节点。本仓库 submodule cbdc-chain/,本页所有路径相对该 submodule 根。
基本事实
| 项 | 值 | 出处 |
|---|---|---|
| 路径 | cbdc-biz/app/issuer/ | — |
| 独立 go.mod | 无(共用 cbdc-biz/go.mod) | — |
| Go 文件数 | 10(含 wire_gen.go 与 conf.pb.go,无 _test.go) | — |
| README | 目录内无 | — |
目录:
cbdc-biz/app/issuer/
├── Makefile
├── cmd/issuer/{main.go,wire.go,wire_gen.go}
├── internal/
│ ├── biz/ biz.go + issuer.go
│ ├── conf/ conf.proto + conf.pb.go
│ ├── server/ server.go + grpc.go
│ └── service/ service.go + issuer.go无 internal/data/、internal/worker/、configs/ 子目录。
入口启动(main.go)
来源:cbdc-biz/app/issuer/cmd/issuer/main.go。
-conf flag 默认 ../../configs(main.go:45)。
Wire DI
来源:cmd/issuer/wire.go:1-24、wire_gen.go:26-32。
wireApp(*conf.Server, log.Logger, *node.Node)
└─ biz.NewIssuerBiz(node)
└─ service.NewIssuerService(issuerBiz)
└─ server.NewGRPCServer(conf.Server, service, logger)
└─ newApp(logger, gs)3 个 ProviderSet:server (internal/server/server.go)、biz (internal/biz/biz.go)、service (internal/service/service.go);外加顶层 newApp 函数(wire.go:22)。
internal/biz
来源:cbdc-biz/app/issuer/internal/biz/issuer.go。
go
// :22-25
type IssuerBiz struct {
node *node.Node
log log.Helper
}
// :62-68
type IssueRequest struct {
Recipient string
Amount uint64
Message string
AssetMark string
RecipientNode string // todo: 未来自动计算
}| 方法 | file:line | 职责 |
|---|---|---|
NewIssuerBiz | issuer.go:30-32 | 构造 |
TotalSupply | issuer.go:34-60 | 已发行 token 总量(按 TokenSymbol 过滤后求和) |
IssueWithMarked | issuer.go:70-109 | 核心发行(支持标记 token) |
IssueWithMarked 关键步骤
来源:issuer.go:70-109。
TotalSupply Token SDK 调用链
来源:issuer.go:34-60。
tok.GetManagementService(node) :35
→ tms.WalletManager() :36
→ wm.IssuerWallet(ctx, "") :39
→ issuerWallet.ListIssuedTokens() :45
→ 按 TokenSymbol 过滤、求和internal/data
不存在
issuer 无 internal/data/ 目录。所有状态依赖:
- Fabric ledger(经 Fabric Smart Client)
- bizhub(身份注册表、标记 token 验证)
internal/service
来源:cbdc-biz/app/issuer/internal/service/issuer.go:12-15。
go
type IssuerService struct {
v1.UnimplementedIssuerServiceServer
biz *biz.IssuerBiz
}| RPC | file:line | 入参 → 出参 | 逻辑 |
|---|---|---|---|
IssueToken | issuer.go:21-39 | IssueTokenRequest → IssueTokenResponse | 解析 Amount → 构造 biz.IssueRequest(含可选 AssetMark)→ 调 biz.IssueWithMarked() → 返回 txID |
TotalSupply | issuer.go:41-49 | TotalSupplyRequest → TotalSupplyResponse | 调 biz.TotalSupply() |
对应 proto:api/cbdc-biz/v1/issuer.proto:7-29。
proto
service IssuerService {
rpc IssueToken(IssueTokenRequest) returns (IssueTokenResponse) {}
rpc TotalSupply(TotalSupplyRequest) returns (TotalSupplyResponse) {}
}
message IssueTokenRequest {
string amount = 1;
string recipient = 2;
string message = 3;
optional string asset_mark = 4;
string recipient_node = 5;
}
message IssueTokenResponse { string message = 1; } // txID
message TotalSupplyRequest {}
message TotalSupplyResponse { string total_supply = 1; }internal/conf
来源:cbdc-biz/app/issuer/internal/conf/conf.proto。
proto
message Bootstrap { Biz biz = 1; }
message Biz {
Server server = 1;
string bizhub_addr = 2; // 必需;缺失则 main.go:109 panic
Observability observability = 3;
TLS bizhub_tls = 4;
}
message TLS {
bool enabled, insecure_skip_verify;
string server_name, ca_cert, client_cert, client_key;
}
message Server {
string network, addr;
google.protobuf.Duration timeout;
}
message Observability {
Metrics metrics;
Tracing tracing; // endpoint / sample_rate / environment
Logging logging; // level
}行号取自 conf.proto:8-52。
configs
不存在
issuer app 内无 configs/ 目录;配置通过 -conf 指向 ../../configs。
端口
实测自 cbdc-biz/conf/issuer/core.yaml:
| 用途 | 值 | 出处 |
|---|---|---|
gRPC(Server.addr) | 0.0.0.0:9100 | cbdc-biz/conf/issuer/core.yaml:9 |
FSC P2P(fsc.p2p.listenAddress) | /ip4/0.0.0.0/tcp/9101 | cbdc-biz/conf/issuer/core.yaml:30 |
| 配置 schema | Server.addr 字段 | internal/conf/conf.proto:28-32 |
与其他 app 的关系
Issuer → bizhub(出站)
| 用途 | 出处 |
|---|---|
| TLS / 客户端初始化 | main.go:109-121 |
| 跨银行身份解析 | main.go:124 BatchGetWalletCertificates |
| 标记 token 验证 | biz/issuer.go:77 IsValidAssetMark(mt) |
bizhub → Issuer(入站)
来源:cbdc-biz/app/bizhub/internal/biz/settlement_biz.go。
| 调用方 | RPC | 出处 |
|---|---|---|
bizhub settlement_biz | IssueToken(mintTokens 铸币) | settlement_biz.go:351 |
bizhub settlement_biz | IssueToken(补偿重铸) | settlement_biz.go:1174 |
bizhub settlement_biz | TotalSupply(结算统计) | settlement_biz.go:1327 |
字段 issuerClient pb.IssuerServiceClient 定义于 settlement_biz.go:57。
Issuer ↔ Endorser
不直接调用。Issuer 通过 pkg/views/issue.go:90 的 vctx.RunView(NewAuditAndEndorseView(tx)) 间接调用 view.Identity("endorser1")(pkg/views/endorsement.go:44)。
Issuer ↔ Institution
不直接调用。Institution 作为 FSC View Responder 接收 Issuer 发起的 IssueCashView,由 Institution main.go:220 注册的 AcceptCashView ← IssueCashView 处理。
与 cbdc-biz/pkg/
| pkg | 用途 | 出处 |
|---|---|---|
pkg/common/biz-client | bizhub 客户端 | main.go:10、biz/issuer.go:9 |
pkg/common/marked | 标记 token 类型定义 | biz/issuer.go:10 |
pkg/common/nodesdk | FSC 启动 | main.go:11 |
pkg/common/wallet_common | 身份解析 + 金额解析格式化 | main.go:12、service/issuer.go:9 |
pkg/runtime | 启动日志 LogStartup | main.go:14 |
pkg/constants | TokenSymbol | main.go:13、biz/issuer.go:11 |
pkg/signet | OTel tracing | main.go:15 |
pkg/views | 4 个 View:IssueCashView / IssuerRedeemAcceptView / RedeemView / SubmitSignatureView | main.go:17、biz/issuer.go:12 |
FSC View 注册
来源:main.go:133-135。
go
reg.RegisterResponder(&views.IssuerRedeemAcceptView{}, &views.RedeemView{})
reg.RegisterResponder(&views.IssuerRedeemAcceptView{}, &views.SubmitSignatureView{})Issuer 作为 Responder 接收其他节点发起的 RedeemView / SubmitSignatureView。
端到端:发行流程
测试
issuer app 目录内无 _test.go,也无 issuer 专属 e2e 套件。但 tests/ e2e harness 经 IssuerService.IssueToken 为各套件铸币:WalletKit.CreateAndFund(tests/internal/bizclient/walletkit.go:112)→ IssueTokens(walletkit.go:126)→ Issuer.IssueToken(walletkit.go:130),被 tests/marked_tokens、tests/transfer、tests/fees、tests/auditor_rulesets 等套件调用。
相关代码(替代历史文档)
cbdc-chain/docs/ 与 cbdc-biz/docs/ 已与代码脱节
历史设计文档(如 settlement-redeem-two-step-signing.md / settlement_timeout_solution.md / plans/2026-02-04-nested-rule-group.md)虽存在,但已不作为本 wiki 的事实依据。请直接读以下代码:
| 主题 | 代码位置 |
|---|---|
| 赎回 / 签名两步流程 | pkg/views/redeem.go(IssuerRedeemAcceptView:138 / RedeemView:64)、pkg/views/transfer.go(SubmitSignatureView:674) |
| settlement 超时处理 | cbdc-biz/app/bizhub/internal/worker/settlement_timeout_worker.go |
| 规则组 | cbdc-biz/pkg/common/tx_selector/、BizHub ent schema tx_selector_group.go |
看代码推荐路径
cmd/issuer/main.go:62-146→ 启动顺序(特别注意 bizhub 必需)。internal/biz/issuer.go:22-109→ IssuerBiz + IssueRequest + IssueWithMarked。internal/service/issuer.go:12-49→ gRPC 翻译层。pkg/views/issue.go:38-102→ View 内部 Token SDK 调用。
[未核]
- issuer app 主 README(无)。
- issuer app 内单元测试(无
_test.go)。