4. 管理PK账户模式的链

4.1. 从零生成链账户部署PK模式链

如果对链账户的公私钥对无特殊要求则可基于部署PK账户模式的链搭建链,如果有特殊要求则参考此文章。

阅读本章节前,请先阅读部署PK账户模式的链,并确保已完成该章节相关的环境依赖准备。

下文将展示通过长安链cmc工具生成新的公私钥对,并基于此搭建新的链;如果有其他生成公私钥对的工具,用户可自行采用,搭建链的流程相似。

4.1.1. 生成链账户

pk模式无证书概念,因此对于节点、管理员以及用户而言,都是公私钥的形式。 节点账户的地址需要添加到共识列表,管理员账户需要添加到管理员列表; 而普通用户账户,可以直接调用管理员部署的合约,无需注册。

4.1.1.1. 部署cmc命令行工具

长安链命令行工具cmc安装, 请参考长安链命令行工具

4.1.1.2. 生成节点账户

  # 生成节点账户私钥
$ ./cmc key gen -a ECC_P256 -p ./ -n consensus1.key
 
  # 导出节点账户公钥
$ ./cmc key export_pub -k consensus1.key -n consensus1.pem
 
 # 计算节点账户地址
$ ./cmc cert nid --node-pk-path=./consensus1.pem
node id : QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93

4.1.1.3. 生成admin账户

# 生成管理员私钥
 ./cmc key gen -a ECC_P256 -p ./ -n admin.key

# 导出管理员公钥
 ./cmc key export_pub -k admin.key -n admin.pem
 
# 查看管理员公钥(账户)
$ cat admin.pem
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsIYfDrQCt1/H8Yj5KKKD+uO28zz7
nTovDgim/jezoGdpmNOUp6lwrN47pxBUpnxEXIqHBwz8uaVR1z3y9kDvTg==
-----END PUBLIC KEY-----

重复以上步骤分别生成4个节点账户和4个管理员账户。

4.1.2. 修改链配置

先将部署PK账户模式的链文章处所生成的相关配置文件内的链账户信息替换成上文新生成的。

配置文件目录结构说明

./config
└── node1
    ├── admin
       ├── admin1 #optional
          ├── admin1.key 
          └── admin1.pem
       ├── admin2
          ├── admin2.key
          └── admin2.pem
       ├── admin3
          ├── admin3.key
          └── admin3.pem
       ├── admin4
          ├── admin4.key
          └── admin4.pem
    ├── chainconfig
       └── bc1.yml # 更新后的链配置文件,参考上节说明
    ├── chainmaker.yml # 更新后的链配置文件,参考上节说明
    ├── log.yml
    ├── node1.key #节点1密钥
    ├── node1.nodeid #节点1的nodeid
    ├── node1.pem #节点1的公钥
    └── user #optional
        └── client1
            ├── client1.addr
            ├── client1.key
            └── client1.pem

4.1.2.1. 替换公私钥对

在启动节点之前,需要将以上部署过程中用到的各个节点公私钥、管理员公私钥替换为以上用cmc生成的公私钥对。

4.1.2.2. 修改配置文件

将上文获取的节点账户和管理员账户,配置到链配置文件bc1.ymltrust_roots里,并将bc1.ymlchainmaker.yml中的nodes.node_id替换为以上获取的节点nodeId。

配置文件修改位置如下

  • bc1.yml(链配置文件)

#共识配置
consensus:
  # Consensus type: 1-TBFT,5-DPOS
  type: 1
  nodes:
    - org_id: "public"
      node_id:
        - "QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93"
        - "QmSXhWkujKh2PEN5tFuiTBnSbkx7vN6P9zPoa6RViLdpdA"
        - "QmfR4jNLsBK3FedeCLyTmzaCeaECK3VjDRoY6XcjiUpWYJ"
        - "QmRKZyDH89CH3zJaSC5VHn9tgcBbs7jc1mDVd9QgyzmKan"
      
trust_roots:
  - org_id: "public"
    root:
      - "../config/node1/admin/admin1/admin1.pem"
      - "../config/node1/admin/admin2/admin2.pem"
      - "../config/node1/admin/admin3/admin3.pem"
      - "../config/node1/admin/admin4/admin4.pem"
  • chainmaker.yml (节点配置文件)

# Network Settings
net:
  # Network provider, can be libp2p or liquid.
  # libp2p: using libp2p components to build the p2p module.
  # liquid: a new p2p module we build from 0 to 1.
  # This item must be consistent across the blockchain network.
  provider: LibP2P

  # The address and port the node listens on.
  # By default, it uses 0.0.0.0 to listen on all network interfaces.
  listen_addr: /ip4/0.0.0.0/tcp/11301

  # The seeds peer list used to join in the network when starting.
  # The connection supervisor will try to dial seed peer whenever the connection is broken.
  # Example ip format: "/ip4/127.0.0.1/tcp/11301/p2p/"+nodeid
  # Example dns format:"/dns/cm-node1.org/tcp/11301/p2p/"+nodeid
  seeds:
    - "/ip4/127.0.0.1/tcp/11301/p2p/QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93"
    - "/ip4/127.0.0.1/tcp/11302/p2p/QmSXhWkujKh2PEN5tFuiTBnSbkx7vN6P9zPoa6RViLdpdA"
    - "/ip4/127.0.0.1/tcp/11303/p2p/QmfR4jNLsBK3FedeCLyTmzaCeaECK3VjDRoY6XcjiUpWYJ"
    - "/ip4/127.0.0.1/tcp/11304/p2p/QmRKZyDH89CH3zJaSC5VHn9tgcBbs7jc1mDVd9QgyzmKan"

同时各个节点部署目录下的bc.ymlchainmaker.yml配置文件按照以上说明进行修改。

4.1.3. 节点部署和链启动

节点部署启动与部署PK账户模式的链文章一致,可自行参考。

按照以上方式启动org1、org2、org3和org4下的共识节点,等到所有节点建立连接,表明区块链网络部署成功,并可以对外提供区块链服务。
可通过遗下命令查看节点日志,若看到all necessary peers connected则表示节点已经准备就绪。

[INFO]  [Net]   libp2pnet/libp2p_connection_supervisor.go:116   [ConnSupervisor] all necessary peers connected.

4.1.4. 部署/调用智能合约

链部署后,再进行部署/调用合约测试,以验证链是否正常运行。部署合约的使用教程可详见:部署示例合约

4.2. 链节点增删管理

4.2.1. 同步节点的增删

在pk模式下,同步节点可以自由加入和退出网络,并同步账本,但不参与共识。

4.2.1.1. 新增同步节点

1、先生成新节点的节点账户,可参考生成节点账户

2、再基于所要加入的链的创世区块配置文件。bc.yml,启动节点,节点启动成功后将自动加入链网络。

4.2.1.2. 更新、删除、查询同步节点

暂不支持同步节点的更新、查询、删除功能,原则上同步节点停止运行则视为自动退出。

4.2.2. 共识节点的增删

如果节点要从同步节点升级为共识节点,则需要用管理员账号进行操作。

4.2.2.1. 通过CMC工具管理共识节点

  • 增加共识节点

./cmc client chainconfig consensusnodeid add \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--user-signkey-file-path=./testdata/crypto-config/node1/admin/admin1/admin1.key \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--node-id=QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93 \  #这里为新添加节点的nodeId
--node-org-id=public
  • 更新共识节点Id

./cmc client chainconfig consensusnodeid update \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--user-signkey-file-path=./testdata/crypto-config/node1/admin/admin1/admin1.key \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--node-id=QmXxeLkNTcvySPKMkv3FUqQgpVZ3t85KMo5E4cmcmrexrC \
--node-id-old=QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93 \ 
--node-org-id=public
  • 删除共识节点

./cmc client chainconfig consensusnodeid remove \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--user-signkey-file-path=./testdata/crypto-config/node1/admin/admin1/admin1.key \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--node-id=QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93 \
--node-org-id=public
  • 查询共识节点
    共识节点可以通过链配置查询,在consensus字段下会返回当前区块链网络中的共识节点列表,命令如下:

./cmc client chainconfig query \
--sdk-conf-path=./testdata/sdk_config_pk.yml

  "consensus": {
    "nodes": [
      {
        "node_id": [
          "QmeqnZEgGeQYyc4qX92XV3SxafqRJqCQ9388jWp2N1oA93",
          "QmSXhWkujKh2PEN5tFuiTBnSbkx7vN6P9zPoa6RViLdpdA",
          "QmfR4jNLsBK3FedeCLyTmzaCeaECK3VjDRoY6XcjiUpWYJ",
          "QmRKZyDH89CH3zJaSC5VHn9tgcBbs7jc1mDVd9QgyzmKan"
        ],
        "org_id": "public"
      }
    ],
    "type": 1
  },

4.3. 链账户的增删

4.3.1. 普通用户的增删

在长安链pk模式下,普通账户无需注册,使用任意工具生成和链保持一致的密码算法的公私钥对,即可为PK模式链的链用户,可直接调用合约。

  • 示例:通过生成普通账户

# 生成普通用户私钥user.key
 ./cmc key gen -a ECC_P256 -p ./ -n user.key

4.3.2. 链管理员账户的增删

目前公钥模式只支持批量更新管理员,新管理员列表会替换旧管理员列表,请谨慎操作。

# 生成管理员私钥
 ./cmc key gen -a ECC_P256 -p ./ -n admin.key

# 导出管理员公钥
 ./cmc key export_pub -k admin.key -n admin.pem
 
# 更新管理员账户
./cmc client chainconfig trustroot update \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--user-signkey-file-path=./testdata/crypto-config/node1/admin/admin1/admin1.key \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--trust-root-org-id=public \
--trust-root-path=./admin.pem,./testdata/crypto-config/node1/admin/admin1/admin1.pem,./testdata/crypto-config/node1/admin/admin2/admin2.pem,./testdata/crypto-config/node1/admin/admin3/admin3.pem

# 查询管理员列表
```shell
 ./cmc client chainconfig query \
--sdk-conf-path=./testdata/sdk_config_pk.yml 

 "trust_roots": [
    {
      "org_id": "public",
      "root": [
        "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEi95yJxLXrKEeBi5ZJqjk2lEFMKfM\n4pydPq78oTbnHQgQc47eTUENVxBIAEI/mAKjsK82i32amXG0Q9dyqZUWRw==\n-----END PUBLIC KEY-----\n",
        "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfVzW4O+RjSi+0mPl7HE80LfDup+E\n3s1mziNwP/d5r6X5D5pSdtcGhR80+9rOnIaayM2Eb61m147K72HmgH0I5A==\n-----END PUBLIC KEY-----\n",
        "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3cFf3ISXtD+vyc6LjuohlHX8A4yG\nIHlMpbwB+H1411TYCgutRoyjXbUy9kcJrXySLS7UCb+/c/yNZ+tz0a6dmA==\n-----END PUBLIC KEY-----\n",
        "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPuPoOk1otXmNnY0nF0B/eBhIMhEC\niE19OneK0AA4nsk6lsef5PoOG8rI5EljCNIxJQ4pOthTMhX6B0gVjlWoZw==\n-----END PUBLIC KEY-----\n"
      ]
    }
  ],

4.4. 链权限管理

4.4.1. 权限定义

PK(Public Key)模式下,链上没有组织概念,所有管理员统一归属于虚拟组织 public。权限定义沿用三段式语法结构:规则 (rule)、组织列表 (orgList)、角色列表 (roleList),但由于 PK 模式无组织概念,orgList 应留空(nil 或空数组),实际生效的仅为规则和角色列表。

  • 规则:以关键字的形式描述了需要多少个管理员共同认可才可访问资源,合法的规则包括:

    • ANY:要求任意一个符合 roleList 要求角色的用户提供签名;

    • ALL:要求所有管理员都提供签名;

    • MAJORITY:要求过半数管理员提供签名(roleList 仅支持 admin);

    • 一个以字符串形式表达的整数 (e.g. “3”):要求大于或等于规定数目的管理员提供签名;

    • 一个以字符串形式表达的分数 (e.g. “2/3”):要求大于或等于规定比例的管理员提供签名;

    • FORBIDDEN:此规则表示禁止所有人访问,在此关键字下 roleList 不生效。

  • 角色列表:合法的角色列表集合,PK 模式下支持的角色包括 admin(管理员)、client(普通用户)、consensus(共识节点)、light(轻节点)、common(同步节点)。

注意:PK 模式下不支持 SELF 规则(因为没有组织概念)。

示例如下:

权限定义 说明
ANY [admin] 任意一个管理员提供签名即可访问对应资源
MAJORITY [admin] 过半数管理员提供签名才可访问对应资源
2/3 [admin] 大于或等于 2/3 比例的管理员提供签名才可访问对应资源(自定义版本的MAJORITY规则)
ANY [consensus] 任意一个共识节点提供签名即可访问对应资源
FORBIDDEN 禁止任何用户访问对应资源

4.4.2. 支持的共识算法

Public模式下,目前支持的共识算法及他们对应的权限策略见下:

4.4.3. 权限管理

Public模式下,支持通过链配置自定义部分资源的权限策略。但以下系统核心资源的权限策略由系统预置,不允许自定义修改

  • P2P 网络资源、共识节点资源

  • 基础交易类型(QUERY_CONTRACT、INVOKE_CONTRACT、SUBSCRIBE、ARCHIVE)

  • 证书管理相关功能(PK 模式无证书体系)

  • 链配置 ALTER_ADDR_TYPE

  • Gas 系统内部调用资源(CHARGE_GAS、CHARGE_GAS_FOR_MULTI_ACCOUNT、REFUND_GAS_VM)

对于不在上述受限列表中的资源,可通过链配置的 resource_policies 字段进行自定义权限策略配置。在该模式下不再需要的系统合约都会被禁止,而针对不同的共识算法,权限控制策略也会有所差别。

4.4.3.1. 交易类型

任意普通用户都可以调用的交易类型

交易类型 功能
INVOKE_CONTRACT 合约调用
QUERY_CONTRACT 合约查询
SUBSCRIBE 订阅

需要任何一个链管理员签名才可以调用的交易类型

交易类型 功能
ARCHIVE 数据归档

4.4.3.2. DPOS共识

大部分系统合约被禁止使用,仅支持如下系统合约

需要任何一个链管理员签名才可以调用的系统合约

CHAIN_CONFIG:链配置更新系统合约

方法 功能
CORE_UPDATE 核心引擎配置更新
BLOCK_UPDATE 区块设置配置更新

CONTRACT_MANAGE:合约管理系统合约

方法 功能
UPGRADE_CONTRACT 升级合约
FREEZE_CONTRACT 冻结合约
UNFREEZE_CONTRACT 解冻合约
REVOKE_CONTRACT 吊销合约

需要半数以上链管理员签名才可以调用的系统合约

CHAIN_CONFIG:链配置更新系统合约

方法 功能
TRUST_ROOT_UPDATE 链管理员更新

任意普通用户都可以调用的系统合约

CONTRACT_MANAGE:合约管理系统合约

方法 功能
INIT_CONTRACT 初始化合约

DPOS_ERC20:DPOS ERC20系统合约所有方法。

DPOS_STAKE:DPOS STAKE系统合约所有方法

Public-DPOS模式默认权限列表如下:

合约名 方法名 资源名 功能描述 默认权限 权限描述
ARCHIVE 归档 {[ADMIN] ANY []} 任一管理员签名
INVOKE_CONTRACT 执行合约 {[] ANY []} 无限制
SUBSCRIBE 订阅 {[] ANY []} 无限制
QUERY_CONTRACT 查询合约 {[] ANY []} 无限制
ACCOUNT_MANAGER REFUND_GAS_VM ACCOUNT_MANAGER-REFUND_GAS_VM / {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER SET_ADMIN ACCOUNT_MANAGER-SET_ADMIN / {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER SET_CONTRACT_METHOD_PAYER ACCOUNT_MANAGER-SET_CONTRACT_METHOD_PAYER / {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER CHARGE_GAS ACCOUNT_MANAGER-CHARGE_GAS 收取gas费用 {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER CHARGE_GAS_FOR_MULTI_ACCOUNT ACCOUNT_MANAGER-CHARGE_GAS_FOR_MULTI_ACCOUNT 收取多个帐户gas费用 {[CONSENSUS] ANY []} 任意节点可以操作
CERT_MANAGE CERTS_ALIAS_DELETE CERT_MANAGE-CERTS_ALIAS_DELETE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_DELETE CERT_MANAGE-CERTS_DELETE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_FREEZE CERT_MANAGE-CERTS_FREEZE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_QUERY CERT_MANAGE-CERTS_QUERY 查询证书 {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_REVOKE CERT_MANAGE-CERTS_REVOKE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_UNFREEZE CERT_MANAGE-CERTS_UNFREEZE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ADD CERT_MANAGE-CERT_ADD / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ALIAS_ADD CERT_MANAGE-CERT_ALIAS_ADD / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ALIAS_UPDATE CERT_MANAGE-CERT_ALIAS_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG UPDATE_VERSION CHAIN_CONFIG-UPDATE_VERSION 更新链版本 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG BLOCK_UPDATE CHAIN_CONFIG-BLOCK_UPDATE 更新区块配置 {[ADMIN] ANY []} 任一管理员签名
CHAIN_CONFIG CONSENSUS_EXT_ADD CHAIN_CONFIG-CONSENSUS_EXT_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG CONSENSUS_EXT_DELETE CHAIN_CONFIG-CONSENSUS_EXT_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG CONSENSUS_EXT_UPDATE CHAIN_CONFIG-CONSENSUS_EXT_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG CORE_UPDATE CHAIN_CONFIG-CORE_UPDATE 更新核心模块配置 {[ADMIN] ANY []} 任一管理员签名
CHAIN_CONFIG ENABLE_OR_DISABLE_GAS CHAIN_CONFIG-ENABLE_OR_DISABLE_GAS / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ID_ADD CHAIN_CONFIG-NODE_ID_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ID_DELETE CHAIN_CONFIG-NODE_ID_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ID_UPDATE CHAIN_CONFIG-NODE_ID_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ORG_ADD CHAIN_CONFIG-NODE_ORG_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ORG_DELETE CHAIN_CONFIG-NODE_ORG_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ORG_UPDATE CHAIN_CONFIG-NODE_ORG_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG PERMISSION_ADD CHAIN_CONFIG-PERMISSION_ADD 添加权限 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG PERMISSION_DELETE CHAIN_CONFIG-PERMISSION_DELETE 删除权限(恢复默认) {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG PERMISSION_UPDATE CHAIN_CONFIG-PERMISSION_UPDATE 更新权限 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG SET_INVOKE_BASE_GAS CHAIN_CONFIG-SET_INVOKE_BASE_GAS 设置基础扣费的Gas大小(单次调用的最少扣除的Gas数量) {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG SET_INVOKE_GAS_PRICE CHAIN_CONFIG-SET_INVOKE_GAS_PRICE 设置调用 Gas 价格 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_MEMBER_ADD CHAIN_CONFIG-TRUST_MEMBER_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_MEMBER_DELETE CHAIN_CONFIG-TRUST_MEMBER_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_MEMBER_UPDATE CHAIN_CONFIG-TRUST_MEMBER_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_ROOT_ADD CHAIN_CONFIG-TRUST_ROOT_ADD 添加管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_ROOT_DELETE CHAIN_CONFIG-TRUST_ROOT_DELETE 删除管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_ROOT_UPDATE CHAIN_CONFIG-TRUST_ROOT_UPDATE 更新管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_ADD CHAIN_CONFIG-RESOURCE_WHITELIST_ADD 添加资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_DELETE CHAIN_CONFIG-RESOURCE_WHITELIST_DELETE 删除资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_UPDATE CHAIN_CONFIG-RESOURCE_WHITELIST_UPDATE 更新资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_LIST CHAIN_CONFIG-RESOURCE_WHITELIST_LIST 查询资源白名单 {[] ANY []} 无限制
CHAIN_CONFIG SET_INSTALL_BASE_GAS CHAIN_CONFIG-SET_INSTALL_BASE_GAS 设置安装/升级合约花费gas {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG SET_INSTALL_GAS_PRICE CHAIN_CONFIG-SET_INSTALL_GAS_PRICE 设置安装/升级合约花费gas/byte {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG ENABLE_ONLY_CREATOR_UPGRADE CHAIN_CONFIG-ENABLE_ONLY_CREATOR_UPGRADE 开启只允许创建者升级合约功能 {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG DISABLE_ONLY_CREATOR_UPGRADE CHAIN_CONFIG-DISABLE_ONLY_CREATOR_UPGRADE 关闭只允许创建者升级合约功能 {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG MULTI_SIGN_ENABLE_MANUAL_RUN CHAIN_CONFIG-MULTI_SIGN_ENABLE_MANUAL_RUN 启用发送者的多重签名执行合约 {[] FORBIDDEN []} 禁止
CONTRACT_MANAGE FREEZE_CONTRACT CONTRACT_MANAGE-FREEZE_CONTRACT 冻结合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE GET_DISABLED_CONTRACT_LIST CONTRACT_MANAGE-GET_DISABLED_CONTRACT_LIST 获取冻结合约列表 {[] ANY []} 无限制
CONTRACT_MANAGE GRANT_CONTRACT_ACCESS CONTRACT_MANAGE-GRANT_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
CONTRACT_MANAGE INIT_CONTRACT CONTRACT_MANAGE-INIT_CONTRACT 安装合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE REVOKE_CONTRACT CONTRACT_MANAGE-REVOKE_CONTRACT 吊销合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE REVOKE_CONTRACT_ACCESS CONTRACT_MANAGE-REVOKE_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
CONTRACT_MANAGE UNFREEZE_CONTRACT CONTRACT_MANAGE-UNFREEZE_CONTRACT 解冻合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE UPGRADE_CONTRACT CONTRACT_MANAGE-UPGRADE_CONTRACT 升级合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE TRANSFER_CONTRACT_OWNER CONTRACT_MANAGE-TRANSFER_CONTRACT_OWNER 转移合约升级权限 {[] ANY []} 无限制(合约层校验Owner身份)
CONTRACT_MANAGE VERIFY_CONTRACT_ACCESS CONTRACT_MANAGE-VERIFY_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
MULTI_SIGN QUERY MULTI_SIGN-QUERY / {[] FORBIDDEN []} 禁止
MULTI_SIGN REQ MULTI_SIGN-REQ / {[] FORBIDDEN []} 禁止
MULTI_SIGN VOTE MULTI_SIGN-VOTE / {[] FORBIDDEN []} 禁止
PRIVATE_COMPUTE SAVE_CA_CERT PRIVATE_COMPUTE-SAVE_CA_CERT / {[] FORBIDDEN []} 禁止
PRIVATE_COMPUTE SAVE_ENCLAVE_REPORT PRIVATE_COMPUTE-SAVE_ENCLAVE_REPORT / {[] FORBIDDEN []} 禁止
PUBKEY_MANAGE PUBKEY_ADD PUBKEY_MANAGE-PUBKEY_ADD / {[] FORBIDDEN []} 禁止
PUBKEY_MANAGE PUBKEY_DELETE PUBKEY_MANAGE-PUBKEY_DELETE / {[] FORBIDDEN []} 禁止
  V2.3.3版本去掉ALTER_ADDR_TYPE(修改地址类型)功能,地址类型需要在链初始化时确定,确定后不支持修改。

4.4.3.3. TBFT共识

大部分系统合约被禁止使用,仅支持如下系统合约

需要任何一个链管理员签名才可以调用的系统合约

CONTRACT_MANAGE:合约管理系统合约

方法 功能
INIT_CONTRACT 创建合约
UPGRADE_CONTRACT 升级合约
FREEZE_CONTRACT 冻结合约
UNFREEZE_CONTRACT 解冻合约
REVOKE_CONTRACT 吊销合约

需要半数以上链管理员签名才可以调用的系统合约

CHAIN_CONFIG:链配置更新系统合约

方法 功能
CORE_UPDATE 核心引擎配置更新
BLOCK_UPDATE 区块设置配置更新
NODE_ID_ADD 共识节点增加
NODE_ID_DELETE 共识节点删除
NODE_ID_UPDATE 共识节点更新
NODE_ORG_UPDATE 共识节点org更新
ENABLE_OR_DISABLE_GAS GAS开关设置
TRUST_ROOT_UPDATE 链管理员更新

ACCOUNT_MANAGER:审计管理系统合约

方法 功能
SET_ADMIN GAS管理员设置

Public-TBFT模式默认权限列表如下:

合约名 方法名 资源名 功能描述 默认权限 权限描述
ARCHIVE 归档 {[ADMIN] ANY []} 任一管理员签名
INVOKE_CONTRACT 执行合约 {[] ANY []} 无限制
SUBSCRIBE 订阅 {[] ANY []} 无限制
QUERY_CONTRACT 查询合约 {[] ANY []} 无限制
ACCOUNT_MANAGER REFUND_GAS_VM ACCOUNT_MANAGER-REFUND_GAS_VM / {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER SET_ADMIN ACCOUNT_MANAGER-SET_ADMIN 设置管理员地址 {[ADMIN] MAJORITY []} 半数以上管理员多签
ACCOUNT_MANAGER SET_CONTRACT_METHOD_PAYER ACCOUNT_MANAGER-SET_CONTRACT_METHOD_PAYER 为合约方法设置代付款账户 {[CONSENSUS CLIENT ADMIN] ANY []} 任意CLIENT、ADMIN、ConsensusNode可操作
ACCOUNT_MANAGER CHARGE_GAS ACCOUNT_MANAGER-CHARGE_GAS 收取gas费用 {[] FORBIDDEN []} 禁止
ACCOUNT_MANAGER CHARGE_GAS_FOR_MULTI_ACCOUNT ACCOUNT_MANAGER-CHARGE_GAS_FOR_MULTI_ACCOUNT 收取多个帐户gas费用 {[CONSENSUS] ANY []} 任意节点可以操作
CERT_MANAGE CERTS_ALIAS_DELETE CERT_MANAGE-CERTS_ALIAS_DELETE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_DELETE CERT_MANAGE-CERTS_DELETE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_FREEZE CERT_MANAGE-CERTS_FREEZE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_QUERY CERT_MANAGE-CERTS_QUERY 查询证书 {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_REVOKE CERT_MANAGE-CERTS_REVOKE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERTS_UNFREEZE CERT_MANAGE-CERTS_UNFREEZE / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ADD CERT_MANAGE-CERT_ADD / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ALIAS_ADD CERT_MANAGE-CERT_ALIAS_ADD / {[] FORBIDDEN []} 禁止
CERT_MANAGE CERT_ALIAS_UPDATE CERT_MANAGE-CERT_ALIAS_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG UPDATE_VERSION CHAIN_CONFIG-UPDATE_VERSION 更新链版本 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG BLOCK_UPDATE CHAIN_CONFIG-BLOCK_UPDATE 更新区块配置 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG CONSENSUS_EXT_ADD CHAIN_CONFIG-CONSENSUS_EXT_ADD 添加共识扩展参数 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG CONSENSUS_EXT_DELETE CHAIN_CONFIG-CONSENSUS_EXT_DELETE 删除共识扩展参数 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG CONSENSUS_EXT_UPDATE CHAIN_CONFIG-CONSENSUS_EXT_UPDATE 更新共识扩展参数 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG CORE_UPDATE CHAIN_CONFIG-CORE_UPDATE 更新核心模块配置 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG ENABLE_OR_DISABLE_GAS CHAIN_CONFIG-ENABLE_OR_DISABLE_GAS 是否开启gas {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG NODE_ID_ADD CHAIN_CONFIG-NODE_ID_ADD 添加节点ID {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG NODE_ID_DELETE CHAIN_CONFIG-NODE_ID_DELETE 删除节点ID {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG NODE_ID_UPDATE CHAIN_CONFIG-NODE_ID_UPDATE 更新节点ID {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG NODE_ORG_ADD CHAIN_CONFIG-NODE_ORG_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ORG_DELETE CHAIN_CONFIG-NODE_ORG_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG NODE_ORG_UPDATE CHAIN_CONFIG-NODE_ORG_UPDATE 更新节点ID列表 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG PERMISSION_ADD CHAIN_CONFIG-PERMISSION_ADD 添加权限 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG PERMISSION_DELETE CHAIN_CONFIG-PERMISSION_DELETE 删除权限(恢复默认) {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG PERMISSION_UPDATE CHAIN_CONFIG-PERMISSION_UPDATE 更新权限 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG SET_ACCOUNT_MANAGER_ADMIN CHAIN_CONFIG-SET_ACCOUNT_MANAGER_ADMIN 设置管理员地址 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG SET_INVOKE_BASE_GAS CHAIN_CONFIG-SET_INVOKE_BASE_GAS 设置基础扣费的Gas大小(单次调用的最少扣除的Gas数量) {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG SET_INVOKE_GAS_PRICE CHAIN_CONFIG-SET_INVOKE_GAS_PRICE 设置调用 Gas 价格 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_MEMBER_ADD CHAIN_CONFIG-TRUST_MEMBER_ADD / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_MEMBER_DELETE CHAIN_CONFIG-TRUST_MEMBER_DELETE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_MEMBER_UPDATE CHAIN_CONFIG-TRUST_MEMBER_UPDATE / {[] FORBIDDEN []} 禁止
CHAIN_CONFIG TRUST_ROOT_ADD CHAIN_CONFIG-TRUST_ROOT_ADD 添加管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_ROOT_DELETE CHAIN_CONFIG-TRUST_ROOT_DELETE 删除管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG TRUST_ROOT_UPDATE CHAIN_CONFIG-TRUST_ROOT_UPDATE 更新管理员公钥 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_ADD CHAIN_CONFIG-RESOURCE_WHITELIST_ADD 添加资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_DELETE CHAIN_CONFIG-RESOURCE_WHITELIST_DELETE 删除资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_UPDATE CHAIN_CONFIG-RESOURCE_WHITELIST_UPDATE 更新资源白名单 {[ADMIN] MAJORITY []} 半数以上管理员多签
CHAIN_CONFIG RESOURCE_WHITELIST_LIST CHAIN_CONFIG-RESOURCE_WHITELIST_LIST 查询资源白名单 {[] ANY []} 无限制
CHAIN_CONFIG SET_INSTALL_BASE_GAS CHAIN_CONFIG-SET_INSTALL_BASE_GAS 设置安装/升级合约花费gas {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG SET_INSTALL_GAS_PRICE CHAIN_CONFIG-SET_INSTALL_GAS_PRICE 设置安装/升级合约花费gas/byte {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG ENABLE_ONLY_CREATOR_UPGRADE CHAIN_CONFIG-ENABLE_ONLY_CREATOR_UPGRADE 开启只允许创建者升级合约功能 {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG DISABLE_ONLY_CREATOR_UPGRADE CHAIN_CONFIG-DISABLE_ONLY_CREATOR_UPGRADE 关闭只允许创建者升级合约功能 {[ADMIN] MAJORITY []} 半数以上组织管理员多签
CHAIN_CONFIG MULTI_SIGN_ENABLE_MANUAL_RUN CHAIN_CONFIG-MULTI_SIGN_ENABLE_MANUAL_RUN 启用发送者的多重签名执行合约 {[ADMIN] MAJORITY []} 半数以上管理员多签
CONTRACT_MANAGE FREEZE_CONTRACT CONTRACT_MANAGE-FREEZE_CONTRACT 冻结合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE GET_DISABLED_CONTRACT_LIST CONTRACT_MANAGE-GET_DISABLED_CONTRACT_LIST 获取冻结合约列表 {[] ANY []} 无限制
CONTRACT_MANAGE GRANT_CONTRACT_ACCESS CONTRACT_MANAGE-GRANT_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
CONTRACT_MANAGE INIT_CONTRACT CONTRACT_MANAGE-INIT_CONTRACT 安装合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE REVOKE_CONTRACT CONTRACT_MANAGE-REVOKE_CONTRACT 吊销合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE REVOKE_CONTRACT_ACCESS CONTRACT_MANAGE-REVOKE_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
CONTRACT_MANAGE UNFREEZE_CONTRACT CONTRACT_MANAGE-UNFREEZE_CONTRACT 解冻合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE UPGRADE_CONTRACT CONTRACT_MANAGE-UPGRADE_CONTRACT 升级合约 {[ADMIN] ANY []} 任一管理员签名
CONTRACT_MANAGE TRANSFER_CONTRACT_OWNER CONTRACT_MANAGE-TRANSFER_CONTRACT_OWNER 转移合约升级权限 {[] ANY []} 无限制(合约层校验Owner身份)
CONTRACT_MANAGE VERIFY_CONTRACT_ACCESS CONTRACT_MANAGE-VERIFY_CONTRACT_ACCESS / {[] FORBIDDEN []} 禁止
PRIVATE_COMPUTE SAVE_CA_CERT PRIVATE_COMPUTE-SAVE_CA_CERT / {[] FORBIDDEN []} 禁止
PRIVATE_COMPUTE SAVE_ENCLAVE_REPORT PRIVATE_COMPUTE-SAVE_ENCLAVE_REPORT / {[] FORBIDDEN []} 禁止
PUBKEY_MANAGE PUBKEY_ADD PUBKEY_MANAGE-PUBKEY_ADD / {[] FORBIDDEN []} 禁止
PUBKEY_MANAGE PUBKEY_DELETE PUBKEY_MANAGE-PUBKEY_DELETE / {[] FORBIDDEN []} 禁止
  V2.3.3版本去掉ALTER_ADDR_TYPE(修改地址类型)功能,地址类型需要在链初始化时确定,确定后不支持修改。

4.4.4. 资源白名单管理(v2.3.9新增)

资源白名单是一种通用的权限扩展机制,允许管理员将指定账户地址添加到某个资源的白名单中,使其绕过常规的 forbidden 与 endorsement 权限校验,直接获得该资源的操作权限。适用于:合约升级权限精细化下放、临时授权某个业务账户操作某个特定资源等场景。

  • 适用模式:PK 模式(Public 模式)

  • 版本要求:blockVersion >= v2.3.9

  • 权限要求:add / delete / update 需要半数以上管理员多签,list 无限制

  • 单个资源白名单最多支持 1000 个地址

  • 原理与校验流程详见:身份权限管理 - 资源白名单

关键参数说明:

参数 说明
--resource-name 目标资源名,格式为 [合约名]-[方法名],如 CONTRACT_MANAGE-INIT_CONTRACTCONTRACT_MANAGE-UPGRADE_CONTRACT
--addresses 白名单账户地址列表,多个地址用英文逗号分隔(add / update 必填);地址可带或不带 0x 前缀
--admin-key-file-paths 参与背书的管理员私钥路径列表,多个用英文逗号分隔(需满足半数以上管理员多签);PK 模式无需 --admin-crt-file-paths

4.4.4.1. 添加资源白名单

将指定账户地址添加到某个资源的白名单中。例如,把某个业务账户加入 CONTRACT_MANAGE-UPGRADE_CONTRACT 白名单,使其可以直接升级合约而无需管理员多签:

./cmc client chainconfig resourcewhitelist add \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--resource-name=CONTRACT_MANAGE-INIT_CONTRACT \
--addresses=0x1a2b3c4d5e6f7890abcdef1234567890abcdef12,0xabcdef1234567890abcdef1234567890abcdef34 \
--sync-result=true

4.4.4.2. 更新资源白名单

整体替换指定资源的白名单地址列表(不是增量新增),执行后原有白名单被覆盖:

./cmc client chainconfig resourcewhitelist update \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--resource-name=CONTRACT_MANAGE-INIT_CONTRACT \
--addresses=0x46de8168d3a6897dee158e43f7c8a0953d3ea092 \
--sync-result=true

4.4.4.3. 删除资源白名单

删除某个资源的整个白名单条目,删除后该资源恢复到走正常的 forbidden / endorsement 权限验证:

./cmc client chainconfig resourcewhitelist delete \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--admin-key-file-paths=./testdata/crypto-config/node1/admin/admin1/admin1.key,./testdata/crypto-config/node1/admin/admin2/admin2.key,./testdata/crypto-config/node1/admin/admin3/admin3.key \
--resource-name=CONTRACT_MANAGE-INIT_CONTRACT \
--sync-result=true

4.4.4.4. 查询资源白名单

查询指定资源当前的白名单地址列表,无需管理员背书:

./cmc client chainconfig resourcewhitelist list \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--resource-name=CONTRACT_MANAGE-INIT_CONTRACT

4.4.5. 合约升级权限转移(v2.3.9新增)

当链上开启了 ENABLE_ONLY_CREATOR_UPGRADE(只允许创建者升级合约)功能后,默认只有合约创建者(Creator)可以升级合约。若创建者私钥丢失或人员变动,可通过 transfer-owner 命令将合约升级权限转移给新的账户。

  • 适用模式:PK 模式(Public 模式)

  • 版本要求:blockVersion >= v2.3.9

  • 权限要求:仅当前 Owner(默认为 Creator)本人可发起,不支持管理员多签强制转移

  • 原理与校验流程详见:身份权限管理 - 合约升级权限转移

关键参数说明:

参数 说明
--contract-name 目标合约名称
--new-owner-member-type 新 Owner 成员类型,PK 模式下取 PUBLIC_KEY
--new-owner-member-info 新 Owner 的公钥文件路径(PEM 格式)
--user-signkey-file-path 当前 Owner 的私钥文件路径;若与 sdk_config 中默认账户一致可省略

4.4.5.1. 转移合约 Owner(PK 模式)

以下示例演示”admin1 (creator) → admin2 → admin1”的完整链路。假设 sdk_config_pk.yml 中默认账户为 admin1

Step 1:admin1 将合约 fact_pk 的 Owner 转移给 admin2

当前 Owner 就是 sdk_config 中的默认账户 admin1,无需显式指定签名文件:

./cmc client contract user transfer-owner \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--contract-name=fact_pk \
--new-owner-member-type=PUBLIC_KEY \
--new-owner-member-info=./testdata/crypto-config/node1/admin/admin2/admin2.pem \
--sync-result=true

Step 2:admin2 再将 Owner 转移回 admin1

此时当前 Owner 已经是 admin2,通过 --user-signkey-file-path 显式指定 admin2 的私钥(覆盖 sdk_config 中的默认账户):

./cmc client contract user transfer-owner \
--sdk-conf-path=./testdata/sdk_config_pk.yml \
--user-signkey-file-path=./testdata/crypto-config/node1/admin/admin2/admin2.key \
--contract-name=fact_pk \
--new-owner-member-type=PUBLIC_KEY \
--new-owner-member-info=./testdata/crypto-config/node1/admin/admin1/admin1.pem \
--sync-result=true

注意:

  1. transfer-owner 交易必须由当前 Owner 本人签名——链上会校验发起者身份是否为当前 Owner;若合约从未转移过 Owner,则当前 Owner 默认为 Creator。

  2. 转移成功后,只有新 Owner 才能升级该合约,原 Owner 将失去升级权限,请谨慎操作。

  3. 权限转移不影响合约的调用(INVOKE)与查询(QUERY),仅影响合约的升级权限。

  4. 若非当前 Owner 发起升级,节点会返回 only owner is allowed to upgrade contract 错误。