概述
调用以太坊智能合约的流程包括:
- 编写合约;
- 编译合约得到合约接口abi描述;
- 部署合约得到合约地址address;
- 封装合约的abi和地址,通过SDK等工具实现对合约的调用。
从合约调用流程可知,调用之前必须准备合约abi以及合约地址address。这种使用方式存在以下的问题:
- 合约abi为较长的JSON字符串,调用方不需直接感知;
- 合约地址为20字节的魔数,不方便记忆,若丢失后将导致合约不可访问;
- 合约重新部署后,一个或多个调用方都需更新合约地址;
- 不便于进行版本管理以及合约灰度升级。
为解决以上问题,给调用者提供良好的智能合约调用体验,FISCO BCOS提出CNS合约命名服务。
名词解释
CNS(Contract Name Service)
通过提供链上合约名称与合约地址映射关系的记录及相应的查询功能,方便调用者通过记忆简单的合约名来实现对链上合约的调用。
CNS信息
为合约名称、合约版本、合约地址和合约abi
CNS表
用于存储CNS信息
CNS对比以太坊原有调用方式的优势
- 简化调用合约方式;
- 合约升级对调用者透明,支持合约灰度升级。
对标ENS
ENS (Ethereum Name Service) ,以太坊名称服务。
ENS的功能类似我们较熟悉的DNS(Domain Name Service)域名系统,但提供的不是Internet网址,而是将以太坊(Ethereum)合约地址和钱包地址以xxxxxx.eth网址的方式表示,用于存取合约或转账。两者相比:
- ENS映射的地址类型包括合约地址及钱包地址,CNS可支持,当地址类型为钱包地址时合约abi为空。
- ENS有竞拍功能,CNS不需支持。
- ENS支持多级域名,CNS不需支持。
模块架构
核心流程
用户调用SDK部署合约及调用合约流程如下:
- 部署合约时,SDK生成合约对应的Java类,调用类的deploy接口发布合约获得合约地址,然后调用CNS合约insert接口上链CNS信息。
- 调用合约时,SDK引入合约的Java类,并加载实例化。load加载接口可传入合约地址(原有以太坊方式)或合约名称和合约版本的组合(CNS方式),SDK处理CNS方式时通过调用CNS模块查询链上信息来获取合约地址。
- 对于缺少版本号的合约调用,由SDK实现默认调用合约的最新版本。
- 上链的合约abi信息属于可选字段。