博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
智能合约设计模式--COP
阅读量:5870 次
发布时间:2019-06-19

本文共 1890 字,大约阅读时间需要 6 分钟。

Design by contract

solidity这门语言设计思路是什么?

什么是COP?

COP

Design by contract

面向条件的编程(COP)是面向合约编程的一个子域,作为一种面向函数和命令式编程的混合模式。COP解决了这个问题,通过需要程序员显示地枚举所有的条件。逻辑变得扁平,没有条件的状态变化。条件片段可以被正确的文档化,复用,可以根据需求和实现来推断。重要的是,COP在编程中把预先条件当作为一等公民。这样的模式规范能保证合约的安全。

post-condition

contract PostCheck {    uint public data = 0;    // Check that the 'data' field was set to the value of '_data'.    modifier data_is_valid(uint _data) {        _        if (_data != data)            throw;    }    function setData(uint _data) data_is_valid(_data) {        data = _data;    }}

pre- and post-conditions

"_"

contract PrePostCheck {    uint public data = 0;    // Check that the input '_data' value is not the same as the value    // already stored in 'data'.    modifier data_is_valid(uint _data) {        if (_data == data)           throw;        _    }    // Check that the 'data' field was set to the value of '_data'.    modifier data_was_updated(uint _data) {        _        if (_data != data)            throw;    }    function setData(uint _data) data_is_valid(_data) data_was_updated(_data) {        data = _data;    }}

FEATURES

  • 函数主体没有条件判断

例子:

contract Token {    // The balance of everyone    mapping (address => uint) public balances;    // Constructor - we're a millionaire!    function Token() {        balances[msg.sender] = 1000000;    }    // Transfer `_amount` tokens of ours to `_dest`.    function transfer(uint _amount, address _dest) {        balances[msg.sender] -= _amount;        balances[_dest] += _amount;    }}

改进后:

function transfer(uint _amount, address _dest) {    if (balances[msg.sender] < _amount)        return;    balances[msg.sender] -= _amount;    balances[_dest] += _amount;}

COP的风格

modifier only_with_at_least(uint x) {    if (balances[msg.sender] >= x) _;}function transfer(uint _amount, address _dest)only_with_at_least(_amount) {    balances[msg.sender] -= _amount;    balances[_dest] += _amount;}

扩展阅读:

转载地址:http://atxnx.baihongyu.com/

你可能感兴趣的文章
找回使用Eclipse删除的文件
查看>>
移动开发Html 5前端性能优化指南
查看>>
《系统架构师》——操作系统和硬件基础
查看>>
如何看待一本图书
查看>>
Linux 中如何通过命令行访问 Dropbox
查看>>
开发进度——4
查看>>
JS里验证信息
查看>>
Akka actor tell, ask 函数的实现
查看>>
windows10 chrome 调试 ios safari 方法
查看>>
Netty 4.1.35.Final 发布,经典开源 Java 网络服务框架
查看>>
详解Microsoft.AspNetCore.CookiePolicy
查看>>
SCDPM2012 R2实战一:基于SQL 2008 R2集群的SCDPM2012 R2的安装
查看>>
SQL SERVER中字段类型与C#数据类型的对应关系
查看>>
Linux lsof命令详解
查看>>
SVG path
查看>>
js判断checkbox是否选中
查看>>
多系统盘挂载
查看>>
MySQL函数怎么加锁_MYSQL 函数调用导致自动生成共享锁问题
查看>>
MR1和MR2的工作原理
查看>>
Eclipse中修改代码格式
查看>>