PIL派链流动性质押挖矿系统丨PIL派链流动性质押挖矿系统开发(逻辑及详情)丨PIL派链流动性质押挖矿开发源码方案

简介: 智能合约代码编写:contract Students { struct StudentInfo { uint32 _studentId; bytes32 _studentName; } mapping (uint32 => StudentInfo) private _studentMapping; function addStudent(uint32 studentId, bytes32 studentName) public returns(bool){ //TODO: }}

智能合约代码编写:

contract Students {
struct StudentInfo {

    uint32 _studentId;
    bytes32 _studentName;
}
mapping (uint32 => StudentInfo) private _studentMapping;
function addStudent(uint32 studentId, bytes32 studentName) public returns(bool){
  //TODO:
}

}

这种写法,代码全部在一个智能合约中,如果现有的智能合约已经不能满足业务诉求,比如类型为uint32字段需升级为为uint64,或者合约中添加一个新的字段,比如sex,那这个智能合约就没有用了,需要重新部署。但因为重新部署,合约地址变了,无法访问到之前的数据。

一种做法是对合约进行分层,将业务逻辑和数据分离,如下所示:

contract StudentController {
mapping (uint32 => address) private _studentMapping;

function addStudent(uint32 studentId, bytes32 studentName) public returns(bool){
  //TODO:
}

}
contract Student {
uint32 _studentId;
bytes32 _studentName;

//uint8 sex;

}

这种写法使得逻辑和数据分离,当需要新增一个性别sex字段时,原始数据可以编写两个StudentController合约,通过版本区分,新的Student采用新的逻辑,需要业务层面做兼容性处理,其最大的问题是对于原有数据的交互性操作,需要跨合约完成,非常不方便,比如查询所有学生信息。

我们再次进行分层,多出一个map层,专门用于合约数据管理,即使业务逻辑层和数据层都出现问题,也没有关系,只需要重新编写业务逻辑层和数据层,并对原有数据进行特殊处理就可以做到兼容。不过,这种做法需要提前在数据合约中做好版本控制(version),针对不同的数据,采用不同的逻辑。

这种做法最大的好处是数据全部保存在StudentMap中,数据合约和逻辑合约的变更都不会影响到数据,且在后续的升级中,可以通过一个controller合约做到对新老数据的兼容,如下所示:

contract StudentController {
mapping (uint32 => address) private _studentMapping;
constructor(address studentMapping) public {

  _studentMapping = studentMapping;
}
function addStudent(uint version, uint32 studentId, bytes32 studentName, uint8 sex) public returns(bool){
  if(version == 1){
        //TODO
    }else if(version == 2){
        //TODO
    }
}

}
contract StudentMap {
mapping (uint32 => address) private _studentMapping;

function getStudentMap() public constant returns(address){
  return _studentMapping;
}

}
contract Student {
uint8 version;
uint32 _studentId;
bytes32 _studentName;

//uint8 sex;

}

统一接口

智能合约尽管具备很多高级语言的特性,但是本身还是存在很多限制。对于业务的精准处理,需要采用Event事件进行跟踪,对于不同的合约和方法,可以编写不同的Event事件,如下:

PS:你也可以采用require的方式进行处理,不过require方式不支持动态变量,每个require处理后需要填入特定的报错内容,在SDK层面耦合性太重,且不便于扩展。

contract StudentController {
//other code

event addStudentSuccessEvent(...); //省略参数,下同
event addStudentFailEvent(...);

function addStudent(bytes32 studentId, bytes32 studentName) public returns(bool){
  if(add success){
      addStudentSuccessEvent(...);
        return true;
    }else {
      addStudentFailEvent(...);
        return false;
    }
}

}

相关文章
|
区块链
DEFi借贷理财挖矿系统DAPP开发合约代码详情
constructor(uint256 initialBorrows, uint256 initialLends, uint256 minAPR) { _tokenIds = Counters.newCounter(initialBorrows + initialLends);
|
算法 区块链
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
Defi+NFT质押流动性挖矿系统开发/LP质押挖矿功能开发解析
|
缓存 算法 安全
浅谈defi/nft/lp/pil/dapp代币智能合约流动性质押挖矿系统开发(技术方案及逻辑)丨代码部署
// Proposal defined a consesensus proposal which can // be gossiped to other node and can be serilized // for persistent store. message Proposal {
|
JavaScript 前端开发 UED
LSD赛道流动性挖矿dapp系统开发源代码|LP流动性质押分红模式定制详情
LSD赛道流动性挖矿dapp系统开发源代码|LP流动性质押分红模式定制详情
|
前端开发
LP子母双币质押流动性挖矿系统开发源代码|分红机制定制详情
LP子母双币质押流动性挖矿系统开发源代码|分红机制定制详情
|
区块链 Python
PIL质押分红NFT系统开发讲解方案模式
PIL质押NFT分红模式系统开发讲解方案模式
117 1
流动性质押挖矿矿池系统开发(开发案例)丨流动性质押挖矿矿池系统开发(详细及源码)
? (amountSpecified - state.amountSpecifiedRemaining, state.amountCalculated) (state.amountCalculated, amountSpecified - state.amountSpecifiedRemaining);
|
存储 前端开发 JavaScript
流动性质押挖矿系统开发技术详情,LP/DAPP流动性质押挖矿系统开发应用方案及分析
What is dApp?   DApps are similar to regular applications,but they run on point-to-point networks(such as blockchains).   However,unlike traditional applications,dApps can run without any human intervention and are not owned by any entity,but distribute tokens to users representing ownership.To co
流动性质押挖矿系统开发技术详情,LP/DAPP流动性质押挖矿系统开发应用方案及分析
|
人工智能 物联网 大数据
流动性质押挖矿分红系统开发案例源码,dapp/lp流动性质押挖矿分红系统开发技术说明及方案
现阶段,Web3.0处于早期发展阶段。由于web3.0具有“智能机器广泛参与到网络过程”的鲜明特征,所以Web3.0的发展将离不开云计算、大数据、人工智能、物联网、区块链等相关技术。而区块链技术是Web3.0最关键的技术。
|
存储 算法 安全
PIL链质押挖矿分红开发功能丨PIL链质押挖矿分红系统开发实现技术详细丨PIL链质押挖矿分红系统源码部署
  长安链支持自动发现、自动连接的组网方式,默认在线的每个节点都可以作为种子节点为其他节点提供网络发现服务,每个种子节点都会记录网内节点地址信息。当有新节点连接到某个种子节点时,新节点会向该种子节点查询网内其他可连接节点的地址,拿到其他节点地址后,新节点会主动尝试与这些节点建立连接;另外,种子节点在接受了新节点链接后,会通过网络发现服务将该新节点的地址通知给其他在线的种子节点,其他节点在获得该新节点地址后,也会主动尝试与该新节点建立连接。
下一篇
无影云桌面