前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于nest2.0智能合约的架构解析二(NESTtoken与IBMapping)

关于nest2.0智能合约的架构解析二(NESTtoken与IBMapping)

作者头像
Tiny熊
发布2021-02-25 11:33:38
4830
发布2021-02-25 11:33:38
举报
文章被收录于专栏:深入浅出区块链技术

我们上一篇文章对nest2.0整体架构做了一个说明,本文则对每个文件进行进一步的解释。

前言

nest2.0一共七个文件在上一篇文章里面已经说过了。其中最重要的两个文件是token部分和合约映射部分。前者是nest的token基石,而后者则为了nest合约的灵活升级做了准备。我们在本文对这两个合约做简要的解释。我们通过对合约地址的查询可以看到。最早的NESTtoken,也就是IBNEST,这个合约是2019年5月份部署的;而后面的几个合约都是2020年上半年部署的;这就是为什么整个nest2.0看起来似乎很不太协调,因为整个项目的跨度达到了一年左右

1.基本概念——mapping

先特别说明一下,在nest2.0里面的很多地方都用到了mapping。我在这里简单的讲一下。solidity里的映射可以理解为python里的字典,建立键-值的对应关系,可以通过键来查找值,键必须是唯一的,但值可以重复。

定义方式为:mapping(键类型=>值类型),例如mapping(address=>uint) public balances,这个映射的名字是balances,权限类型为public,键的类型是地址address,值的类型是整型uint,在solidity中这个映射的作用一般是通过地址查询余额。键的类型允许除映射外的所有类型。maping是根据定义的类型确定名次mapping(a=>b) mmm。表示mmm是一个数组名字,其数组类型是a,赋值的类型是b。

例如:映射balances中包括三个键值对(user1:100,user2:145,user3:195),输入user2即可得到145

下面来看一个例子:

代码语言:javascript
复制
contract MappingExample{
    mapping(address => uint) public balances;
    function update(uint amount) returns (address addr){
        balances[msg.sender] = amount;
        return msg.sender;
    }
}

说明:定义balances为一个映射,msg.sender是合约创建者的地址,函数update有一个整型参数amount(数量), balances[msg.sender]=amount的意思是将参数amount的值和msg.sender这个地址对应起来。好了,接下来我们说两个合约,NESTtoken和IBMapping。

2. NESTtoken

NESTtoken基于的是IBNEST.sol 基本上就是一个erc20,没有什么特别额外的功能。这个里面唯一值得注意的是library IterableMapping 。library IterableMapping 在这里起到了一个顺序可查询与删除的功能。

3. IBMapping

然后是IBMapping。主要是三个功能:第一个功能是制作一个智能合约映射图;第二个功能是在初始化中,将创建者的地址设置为管理员用户,并提供修改和查询功能;第三个功能是提供智能合约映射的修改和查询。我们一个个说。

3.1 Superman

我们注意到的第一个内容就是Superman(超级管理者)。

代码语言:javascript
复制
mapping (address => bool) owners;          // Superman address
 /**
    * @dev Initialization method
    */
 constructor () public {
  owners[msg.sender] = true;
 }

所有者是一个数组。智能合约的构造者就是所有者里面的真。

3.2 地址对应

代码语言:javascript
复制
function addContractAddress(string memory name, address contractAddress) public {
  require(checkOwners(msg.sender) == true);
  ContractAddress[name] = contractAddress;
 }

这个表示的是,发送者的所有者权限有效,那么将ContractAddress里面name赋值为contractAddress) ,说白了就是将两者对应起来。这是一个非常关键的内容,应该学习。

3.3 合约引用

首先添加在要引用的合约里面结构体和函数

代码语言:javascript
复制
contract IBMapping {
    function checkAddress(string memory name) public view returns (address contractAddress);
    function checkOwners(address man) public view returns (bool);
}

在要执行的结构体里面定义这个结构体

代码语言:javascript
复制
IBMapping mappingContract; 

然后在要执行的结构体里面初始化

代码语言:javascript
复制
 constructor(address map) public {
        mappingContract = IBMapping(map); 
                //这句是对外部地址map进行结构体定义,这里定义的是IBMapping.sol的合约地址。

并将map里面的IBMapping与mappingContract 对接,也就是找到智能合约对接表。

代码语言:javascript
复制
        nestContract = IBNEST(address(mappingContract.checkAddress("nest")));
 mappingContract.checkAddress("nest")=addrnest
//这个获取的是nest对应的合约地址

3.4 关于合约映射与引用的说明

关于合约映射与引用源码部分还有三个说明。首先之所以做成这样是,是为了可以随时升级合约地址的位置。其次,为了便于管理,将检测到的合约地址对接如下:address(addrnest)表示显式转换,因此就是nestContract 获得的是token的合约地址。最后,一个addr不用转换因为默认就是addr,第二个因为是从列表里读的,所以从address payable转换为address。区别在于,前者地址可用.transfer()和.send()方法,后者不可以,防止越权。但不不意味着mappingContract 和nestContract 不是payable类型。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.基本概念——mapping
  • 2. NESTtoken
  • 3. IBMapping
    • 3.1 Superman
      • 3.2 地址对应
        • 3.3 合约引用
          • 3.4 关于合约映射与引用的说明
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档