当前位置:首页 > 物联网 > 区块链
[导读] 本节介绍的内容将有助于为你日后解决智能合约的Bug做好充足准备。 注意:在系统中添加新组件时总是有风险的。设计不当的故障保护措施本身可能会成为一个漏洞,许多精心设计的故障保护措施之间的交

本节介绍的内容将有助于为你日后解决智能合约的Bug做好充足准备。

注意:在系统中添加新组件时总是有风险的。设计不当的故障保护措施本身可能会成为一个漏洞,许多精心设计的故障保护措施之间的交互也会造成漏洞的存在。仔细研究智能合约中使用的每一项技术,并仔细研究它们如何协同工作以创建一个健壮的系统。

智能合约高效升级

智能合约在运行过程中发现Bug或者代码需要改进,这会影响整个系统的健壮性,如果发现无法解决的Bug,那就可能会造成严重的经济损失。

在本文中,我们无法涉及到任何复杂的问题。然而有两种最常用的基本方法,最简单的是拥有一个注册表智能合约,包含该智能合约最新版本的地址。对于智能合约用户来说,用户可以无缝的将该智能合约调用和数据转发到最新版本的智能合约中。

无论采用哪种技术,模块化和组件之间的隔离都是非常重要,这样代码更改就不会破坏智能合约功能、孤立数据或需要大量的移植代码成本。这样代码更改就不会破坏功能、孤立数据或需要大量的移植成本。

同样重要的是要有一个安全的方式,让社区决定升级智能合约代码。根据您的智能合约,代码更改可能需要由单个受信任方、一组成员或全部涉众投票批准。如果这个过程可能需要一些时间,那么您需要考虑是否有其他方法可以在发生攻击时更快地做出反应,例如紧急停止或断路器

示例1:使用注册表智能合约来存储智能合约的最新版本

在本例中,调用不会被转发,因此用户应该在每次与当前地址交互之前获取该地址。

contract SomeRegister {

address backendContract;

address[] previousBackends;

address owner;

function SomeRegister() {

owner = msg.sender;

}

modifier onlyOwner() {

require(msg.sender == owner)

_;

}

funcTIon changeBackend(address newBackend) public

onlyOwner()

returns (bool)

{

if(newBackend != backendContract) {

previousBackends.push(backendContract);

backendContract = newBackend;

return true;

}

return false;

}

}

这种方法有两个主要缺点:

1. 用户必须始终查找当前地址,否则任何人都会使用旧版本的智能合约来冒充

2. 在更换智能合约时,您需要仔细考虑如何处理智能合约数据

另一种方法是让智能合约将调用和数据转发到最新版本的智能合约:

示例2:使用DELEGATECALL转发数据和调用

contract Relay {

address public currentVersion;

address public owner;

modifier onlyOwner() {

require(msg.sender == owner);

_;

}

funcTIon Relay(address initAddr) {

currentVersion = initAddr;

owner = msg.sender; // this owner may be another contract with mulTIsig, not a single contract owner

}

funcTIon changeContract(address newVersion) public

onlyOwner()

{

currentVersion = newVersion;

}

function() {

require(currentVersion.delegatecall(msg.data));

}

}

这种方法避免了先前的问题,但有其自身的问题。您在此智能合约中如何存储数据时必须格外小心。如果新智能合约的存储架构与第一个不同,则数据可能最终损坏。此外,该模式的简单版本无法从函数返回值,而只能转发它们,这限制了其适用性。(更复杂的实现尝试通过内联汇编代码和返回大小注册表来解决此问题。)

无论采用哪种方法,找到合适的智能合约升级的方法很重要,否则当在智能合约中发现不可避免的bug时,后果将变得不可预计。

断路器Circuit Breakers

如果满足某些条件,断路器将停止智能合约的执行,并且在发现新bug时非常有用。例如如果发现一个bug,智能合约中的大多数操作可能会被挂起,而现在唯一有效的操作是撤回。您可以给某些受信任方触发断路器的能力,也可以使用编程规则在满足某些条件时自动触发特定断路器。

示例:

bool private stopped = false;

address private owner;

modifier isAdmin() {

require(msg.sender == owner);

_;

}

function toggleContractActive() isAdmin public {

// You can add an additional modifier that restricts stopping a contract to be based on another action, such as a vote of users

stopped = !stopped;

}

modifier stopInEmergency { if (!stopped) _; }

modifier onlyInEmergency { if (stopped) _; }

function deposit() stopInEmergency public {

// some code

}

function withdraw() onlyInEmergency public {

// some code

}

减速带Speed Bumps (减缓智能合约操作)

减速带降低了操作的速度,因此,如果发生恶意操作,则有时间进行恢复。例如DAO在成功请求拆分DAO和这样做的能力之间需要27天。这样可以确保将资金保留在智能合约内,从而增加了收回的可能性。对于DAO,在减速带给定的时间内如没有采取任何有效的措施时,结合我们的其他技术,它们可以非常有效。

示例:

struct RequestedWithdrawal {

uint amount;

uint time;

}

mapping (address =》 uint) private balances;

mapping (address =》 RequestedWithdrawal) private requestedWithdrawals;

uint constant withdrawalWaitPeriod = 28 days; // 4 weeks

function requestWithdrawal() public {

if (balances[msg.sender] 》 0) {

uint amountToWithdraw = balances[msg.sender];

balances[msg.sender] = 0; // for simplicity, we withdraw everything;

// presumably, the deposit function prevents new deposits when withdrawals are in progress

requestedWithdrawals[msg.sender] = RequestedWithdrawal({

amount: amountToWithdraw,

time: now

});

}

}

function withdraw() public {

if(requestedWithdrawals[msg.sender].amount 》 0 && now 》 requestedWithdrawals[msg.sender].time + withdrawalWaitPeriod) {

uint amountToWithdraw = requestedWithdrawals[msg.sender].amount;

requestedWithdrawals[msg.sender].amount = 0;

require(msg.sender.send(amountToWithdraw));

}

}

速率限制Rate Limiting

速率限制暂停或需要批准才能进行重大更改。例如在某个时间段内(例如在1天之内最多只能提取100个以太币),可能只允许存款人提取一定数量或一定比例的总存款-该时间段内的其他提取可能会失败或需要某种特殊的批准 。或者速率限制可以处于智能合约级别,在一段时间内仅由智能合约发行一定数量的代币。

智能合约版本推出

智能合约新版本在正式推出使用前,已经经过大量的安全测试和代码测试。

至少您应该:

1. 拥有100%测试覆盖率的完整测试软件。

2. 在自己的testnet上部署。

3. 在公共测试网上进行大量测试和漏洞赏金。

4. 测试应允许各种参与者大量参与智能合约进行交互。

5. 在主网上部署beta版本,并限制风险数量。

自动弃用AUTOMATIC DEPRECATION

在测试过程中,您可以在一定的时间段后通过阻止任何操作来强制自动弃用。例如alpha版本智能合约可能会工作几个星期后,然后自动关闭所有操作,但最终退出除外。

modifier isActive() {

require(block.number 《= SOME_BLOCK_NUMBER);

_;

}

function deposit() public isActive {

// some code

}

function withdraw() public {

// some code

}

在早期阶段,您可以限制用户(或整个智能合约)使用以太坊的数量,从而降低风险。

Bug赏金计划

进行赏金计划的一些技巧:

· 决定使用(BTC和/或ETH)哪种代币进行赏金分配。

· 决定赏金的预算总金额。

· 根据预算,确定三层奖励:

1. 最低奖励

2.最高奖励

3.如果发现非常严重的漏洞,将授予额外的奖励

· 确定赏金管理员(3个可能是典型的理想人选)。

· 首席开发人员可能应该是赏金评委之一。

· 当收到一个bug报告时,开发负责人,在评审的建议下,应该评估bug的严重性。

· 这个阶段的工作应该是在一个私有的存储库中进行的,问题应在Github上归档。

· 如果这是一个应该被修复的bug,那么在私有repo中,开发人员应该编写一个测试用例,测试用例应该失败,从而确认这个bug。

· 开发人员应实施此修复程序并确保测试可以通过;根据需要编写其他测试,向赏金猎人显示修复方法,将补丁程序合并回公共仓库。

· 确定赏金猎人是否有其他关于修复的反馈。

· 赏金评委根据对漏洞的可能性和影响的评估来确定奖励的大小。

· 在整个过程中让赏金参与者了解情况,然后尽量避免延迟向他们发送奖励。

关于三层奖励的示例,请参见以太坊的赏金计划:https://bounty.ethereum.org/

奖励的价值将根据影响的严重程度而有所不同。对轻微“bug”的奖励从0.05个BTC开始。重要的bug,例如导致共识问题的bug,将会得到最多5个BTC的奖励。如果存在非常严重的漏洞,则可能获得更高的回报(最多25个BTC)。
来源: 区块链研究实验室 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭