CNS方案

概述

调用以太坊智能合约的流程包括: 1. 编写合约; 2. 编译合约得到合约接口abi描述; 3. 部署合约得到合约地址address; 4. 封装合约的abi和地址,通过SDK等工具实现对合约的调用。

从合约调用流程可知,调用之前必须准备合约abi以及合约地址address。这种使用方式存在以下的问题: 1. 合约abi为较长的JSON字符串,调用方不需直接感知; 2. 合约地址为20字节的魔数,不方便记忆,若丢失后将导致合约不可访问; 3. 合约重新部署后,一个或多个调用方都需更新合约地址; 4. 不便于进行版本管理以及合约灰度升级。

为解决以上问题,给调用者提供良好的智能合约调用体验,FISCO BCOS提出CNS合约命名服务

名词解释

CNS对比以太坊原有调用方式的优势

对标ENS

ENS (Ethereum Name Service) ,以太坊名称服务。

ENS的功能类似我们较熟悉的DNS(Domain Name Service)域名系统,但提供的不是Internet网址,而是将以太坊(Ethereum)合约地址和钱包地址以xxxxxx.eth网址的方式表示,用于存取合约或转账。两者相比:

模块架构

CNS架构

核心流程

用户调用SDK部署合约及调用合约流程如下:

SDK部署合约及调用合约流程

数据结构

CNS表结构

CNS信息以系统表的方式进行存储,各账本独立。CNS表定义如下:

Field
Type
Null
Key
Expain
namestringNoPRI合约名称,name和version为联合主键
versionstringNo合约版本,name和version为联合主键
addressstringNo合约地址
abistringYES合约abi
_status_stringNo分布式存储通用字段,“0”可用“1”删除

合约接口

pragma solidity ^0.4.2;
contract CNS
{
    function insert(string name, string version, string addr, string abi) public returns(uint256);
    function selectByName(string name) public constant returns(string);
    function selectByNameAndVersion(string name, string version) public constant returns(string);
}

更新CNS表方式

预编译合约是FISCO BCOS底层通过C++实现的一种高效智能合约,用于FISCO BCOS底层的系统信息配置与管理。引入precompiled逻辑后,FISCO BCOS节点执行交易的流程如下:

CNS合约属于预编译合约类型,节点将通过内置C++代码逻辑实现对CNS表的插入和查询操作,不经EVM执行,因此CNS合约只提供了函数接口描述而没有函数实现。预置CNS合约的precompiled地址为0x1004。

合约接口返回示例

selectByName和selectByNameAndVersion接口返回的string为Json格式,示例如下:

[
    {
        "name" : "Ok",
        "version" : "1.0",
        "address" : "0x420f853b49838bd3e9466c85a4cc3428c960dde2",
        "abi" : "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"co
nstant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\
"type\":\"constructor\"}]"
    },
    {
        "name" : "Ok",
        "version" : "2.0",
        "address" : "0x420f853b49838bd3e9466c85a4cc3428c960dde2",
        "abi" : "[{\"constant\":false,\"inputs\":[{\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"trans\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"co
nstant\":true,\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\
"type\":\"constructor\"}]"
    }
]

SDK_API

SDK开发者可使用org.fisco.bcos.web3j.precompile.cns中以下两接口实现CNS的注册及查询功能。

registerCns

resolve

注意: 1. 在调用接口前,需将sol合约转换Java类,并将生成的Java类以及abi、bin文件置于正确的目录,详细使用方法请参考Web3SDK; 2. 两个接口的使用例子可参考ConsoleImpl.java中的deployByCNS和callByCNS接口实现。

操作工具

控制台可提供部署合约、调用合约、基于合约名查询链上已有合约的功能,2.6及其以上版本控制台使用手册请参考这里, 1.x版本控制台使用手册请参考这里

控制台提供的命令包括: