http://www.7klian.com

Solidity 优化 如何维护排序列表

    require(_isPrevStudent(student, candidateStudent));
  ) public {
    require(_verifyIndex(candidateStudent, score, _nextStudents[candidateStudent]));
  }
  }
    _nextStudents[candidateStudent] = _nextStudents[student];
    internal
    address student,
    require(_nextStudents[student] != address(0));
}
  constructor() public {
      studentLists[i] = currentAddress;
    listSize–;
pragma solidity 0.5.9;
  }
让我们思量一下满意所有要求所需的函数,需要实现 5 个函数。
    updateScore(student, scores[student] + score);
    require(_nextStudents[student] != address(0));
    address newCandidateStudent
    view
  function updateScore(address student, uint256 newScore) public {
      removeStudent(student);
  function _findPrevStudent(address student) internal view returns(address) {
removeStudent
    }
increaseScore和reduceScore可以利用沟通的逻辑来实现,即将旧值更新为新值。主要思想是我们将旧项目姑且删除,然后将其添加到新(或沟通)索引中,该索引应具有新值,因此我们可以反复利用添加/删除函数。

    returns(bool)
    for(uint256 i = 0; i < k; ++i) {

  }
    if(oldCandidateStudent == newCandidateStudent)

可是,在开始实现每个函数之前,我们需要配置基本数据布局(数组,映射等),我们利用上一篇文章中的可迭代映射[8]。建设映射以存储分数并为每个函数编写接口,框架代码如下所示:

    while(true) {
  }
      scores[student] = newScore;

与上一篇文章沟通的 removeStudent 不外需要排除 scores映射。

    require(_nextStudents[student] != address(0));
  function removeStudent(address student, address candidateStudent) public {
addStudent

    _nextStudents[GUARD] = GUARD;
· 从名单中删除学生
  function addStudent(address student, uint256 score, address candidateStudent) public {
  function getTop(uint256 k) public view returns(address[] memory) {
  function increaseScore(
    return (prevStudent == GUARD || scores[prevStudent] >= newValue) &&
pragma solidity 0.5.9;
    } else {
    address prevStudent = _findPrevStudent(student);
  function _findIndex(uint256 newValue) internal view returns(address) {
      currentAddress = _nextStudents[currentAddress];

  }
    {
  mapping(address => uint256) public scores;

    }
      addStudent(student, newScore);

_findIndex 辅佐函数,用于查找新值应该插入在哪一个地点后头。从 GUARD 遍历列表,通过利用_verifyIndex查抄来找到有效的索引。此代码确保我们可以必定地找到有效的索引

  function reduceScore(address student, uint256 score) public {

我们添加验证条件,以防万一在同一索引处举办更新。第一个条件就像移除元素,第二个条件查抄新值是否在旧索引上有效。
        return candidateAddress;
    uint256 score,
    return address(0);
只需通过_isPrevStudent举办验证以删除元素。

    listSize++;
    listSize–;
    address index = _findIndex(score);
    }

代码已宣布此处[9] , 代码如下:
    return studentLists;

  address constant GUARD = address(1);
  function updateScore(
    }
  constructor() public {
  address constant GUARD = address(1);
  }
    scores[student] = 0;
· 提高学生分数
    return studentLists;
    address currentAddress = GUARD;
  mapping(address => address) _nextStudents;
    uint256 score,
· 将新学生添加到具有分数排序的列表中
在上一篇文章[6]中,我们接头了(可以在每个元素上迭代的数据布局)如安在列表中添加元素或从列表中删除元素。这篇文章将扩展我们的数据布局,以维护链上已排序的链表。像上一篇文章一样,我们将通过展示每个函数的实现来举办表明。假如你筹备好了,那就开始吧!
实现

    }
· 低落学生分数

场景典型
  ) public {
           (nextStudent == GUARD || newValue > scores[nextStudent]);

为了使代码易于阅读,我们建设了 2 个帮助函数来查找和验证新值的索引。

从列表中删除学生:removeStudent
    return _nextStudents[prevStudent] == student;

      scores[student] = newScore;
    internal
    for(uint256 i = 0; i < k; ++i) {
    _nextStudents[GUARD] = GUARD;
    require(_nextStudents[newCandidateStudent] != address(0));
  {
优化查找索引
    scores[student] = 0;

本文我们摸索和接头在奇特的 EVM 本钱模子下编写高效的 Solidity 代码的数据布局和实现技能。读者应该已经对 Solidity 中的编码以及 EVM 的总体事情方法所有相识。
让我们从第一个函数 addStudent 开始。与普通的可迭代映射有所差异的是,我们需要在正确的索引处插入新项目,而不是在列表的前面添加以维持我们的排序。

  }

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读