Skip to content

cbdc-biz/app/issuer

发行节点。本仓库 submodule cbdc-chain/,本页所有路径相对该 submodule 根。

基本事实

出处
路径cbdc-biz/app/issuer/
独立 go.mod无(共用 cbdc-biz/go.mod
Go 文件数10(含 wire_gen.goconf.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 默认 ../../configsmain.go:45)。

Wire DI

来源:cmd/issuer/wire.go:1-24wire_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职责
NewIssuerBizissuer.go:30-32构造
TotalSupplyissuer.go:34-60已发行 token 总量(按 TokenSymbol 过滤后求和)
IssueWithMarkedissuer.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
}
RPCfile:line入参 → 出参逻辑
IssueTokenissuer.go:21-39IssueTokenRequestIssueTokenResponse解析 Amount → 构造 biz.IssueRequest(含可选 AssetMark)→ 调 biz.IssueWithMarked() → 返回 txID
TotalSupplyissuer.go:41-49TotalSupplyRequestTotalSupplyResponsebiz.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.addr0.0.0.0:9100cbdc-biz/conf/issuer/core.yaml:9
FSC P2P(fsc.p2p.listenAddress/ip4/0.0.0.0/tcp/9101cbdc-biz/conf/issuer/core.yaml:30
配置 schemaServer.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_bizIssueTokenmintTokens 铸币)settlement_biz.go:351
bizhub settlement_bizIssueToken(补偿重铸)settlement_biz.go:1174
bizhub settlement_bizTotalSupply(结算统计)settlement_biz.go:1327

字段 issuerClient pb.IssuerServiceClient 定义于 settlement_biz.go:57

Issuer ↔ Endorser

不直接调用。Issuer 通过 pkg/views/issue.go:90vctx.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-clientbizhub 客户端main.go:10biz/issuer.go:9
pkg/common/marked标记 token 类型定义biz/issuer.go:10
pkg/common/nodesdkFSC 启动main.go:11
pkg/common/wallet_common身份解析 + 金额解析格式化main.go:12service/issuer.go:9
pkg/runtime启动日志 LogStartupmain.go:14
pkg/constantsTokenSymbolmain.go:13biz/issuer.go:11
pkg/signetOTel tracingmain.go:15
pkg/views4 个 View:IssueCashView / IssuerRedeemAcceptView / RedeemView / SubmitSignatureViewmain.go:17biz/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.CreateAndFundtests/internal/bizclient/walletkit.go:112)→ IssueTokenswalletkit.go:126)→ Issuer.IssueTokenwalletkit.go:130),被 tests/marked_tokenstests/transfertests/feestests/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.goIssuerRedeemAcceptView:138 / RedeemView:64)、pkg/views/transfer.goSubmitSignatureView: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

看代码推荐路径

  1. cmd/issuer/main.go:62-146 → 启动顺序(特别注意 bizhub 必需)。
  2. internal/biz/issuer.go:22-109 → IssuerBiz + IssueRequest + IssueWithMarked。
  3. internal/service/issuer.go:12-49 → gRPC 翻译层。
  4. pkg/views/issue.go:38-102 → View 内部 Token SDK 调用。

[未核]

  • issuer app 主 README(无)。
  • issuer app 内单元测试(无 _test.go)。