由于所有已部署合约都有 24KB 的硬限制,所以除了少数极其简单的应用程序外,其他所有的 Ethereum 应用都是由多个智能合约组成的。

如何才能确保各智能合约间的安全协作呢?

在将代码分解为多个可操作的合约后,我们便会发现有的合约中的函数需要通过另一个合约才能进行调用。

例如,在 Uniswap v2 中,只有合约工厂(contract factory)可以对 Uniswap Pair 进行初始化。

对于 Uniswap 团队来说,只需要稍微检查一下就可以解决的问题对于很多其他项目来说,却需要从头开始重新编写调配解决方案。

在了解问题和开发模式的过程中,我们深入理解了如何借助多个智能合约来构建应用程序,从而使 Yield 更加健壮且安全。

(Yield:http://yield.is/‌)

在本文中,我们将借助几个知名项目中的实例来深入分析智能合约的调配方式。希望大家在读完本文之后可以对照自己项目的需求,选择出最适合自己的方法。

背景知识

前文提到,我们首先要把项目分解成多个智能合约,这是出于技术和精神两个层面的限制要求。

技术限制源于2016年11月发生的一项改变。当时,Ethereum 主网(包括EIP-170)实施了 Spurious Dragon 硬分叉。此举将已部署的智能合约的大小限制在24576字节以内。

(Spurious Dragon硬分叉:https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/‌)

(EIP-170:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-170.md‌)

在没有此项限制时,攻击者可以在部署智能合约期间进行无限次的计算。此举虽然不会对存储在区块链中的数据产生任何影响,但却是一种针对 Ethereum 节点的拒绝服务(Denial-Of-Service)攻击。

由于当时的区块 gas 限制无法支持这种规模的智能合约,所以这项改变当时并没有受到重视:

“该解决方案为储存在区块链中的对象大小设置了最高上限,并使其略高于当前gas上限值(在最坏的情况下,可以使用470万gas,23200字节来创建合约)”

在 DeFi 大爆炸之前,我们为 Yield 编写了2000行智能合约代码,部署后的代码加起来接近 100KB,审核员完全没有觉得项目过于复杂。

但我们仍需把解决方案分解为多个合约。【文章同步发布于漫兮网:https://www.manxinet.com】

复杂性和面向对象程序设计

将区块链应用分解为多个智能合约的第二个原因与技术限制无关,而是与“人”的精神限制有关。

在特定的时间内,我们大脑中能储存的信息量是一定的。相比于处理单一且涉及面广的大问题,人们在处理多个相互间存在关联的小问题时表现会更好。

实际上,Object-Oriented Programming(面向对象程序设计)可以提高软件的复杂性。通过定义代表某种概念的“对象”,并将变量和函数看作该对象的属性,开发人员能够在心里更好地描画和理解需要解决的问题。

Solidity 在合约层面使用了面向对象的编程技术。我们可以将合约看作是一个具有变量和函数的“对象”,在脑海中将复杂的区块链应用程序想象成多个合约的集合,每个合约代表一个单独的实体。

例如,在 MakerDAO 中,每种加密货币都有单独的合约,此外还有记录债务的合约、表示债务和外界间网关的单独合约等等。我们不可能将所有内容都编写在同一个合约中——即使可能,也会异常困难。

把一整个大问题分解成具有内在联系的多个小问题可以帮助我们更快地找出解决方案。【文章同步发布于漫兮网:https://www.manxinet.com】

实现

接下来,让我们一起来研究一下 Uniswap、MakerDAO 以及 Yield 的实现方式。

从简单的例子开始——Uniswap 和 Ownable.sol

我很喜欢 Uniswap v2,因为它非常简单。开发人员用410行智能合约代码就成功建立了去中心化交易所。仅部署了两类合约:工厂和不限数量的配对交换合约。

其工厂合约的设计方式决定了其配对交易合约的部署需要经过两个步骤。首先部署合约,然后用将要进行交易的两个代币对其进行初始化。

由于需要确保只有创建配对交易合约的工厂才能对合约进行初始化,所以他们重新实施了Ownable 模式。

此举取得的效果还不错,如果你也遇到了同样的问题,可以借鉴这个方法。如果你知道自己的合约只需要给另一个合约开通访问特权的话,可以使用 Ownable.sol。甚至都用不到 Uniswap 这种工厂。你可以在一个用户中部署两个合同(Boss和Minion,Minion继承于Ownable.sol),然后执行 minion.transferOwnership(address(boss))。

更为完善的例子——Yield

Yield 的解决方案就没有 Uniswap v2 那么简单了。其核心由五个合约组成,并且特权访问关系并不是一一对应的。部分合约具备的限制功能可以帮助我们访问其他核心合约。

因此,我们只需扩展 Ownable.sol 以生成两个访问层,其中一层有多个成员:

合约所有者可以向特权列表中添加地址(authorized)。继承合约(Inheriting contracts)可以包含 onlyOrchestrated 修改器以限制对授权地址的访问。【文章同步发布于漫兮网:https://www.manxinet.com】

每个地址都会与一个函数签名共同注册,从而收紧对函数的访问权限,增强安全性。

(函数签名:https://www.4byte.directory/‌)

由于我们会在期间部署 orchestrate 合约,所以没有取消访问权限的函数,owner 会通过调用所有合约上的 transferOwnership(adress(0)) 来放弃其特权访问。

我们自己的平台代币 yDai,将从 Orchestrated 继承并限制 mint 在 owner 放弃其特权之前建立的特定合约:

这种模式相对容易实现和调试,并且可以实现我们合约中的函数。

极具迷惑性的例子——MakerDAO

大家都非常讨厌 MakerDAO 中各种难以理解的术语。但在搞清楚 Yield 的调配模式后,我才发现它们二者的实现方式几乎是完全相同的。

1.合约部署者是 wards 的原成员。

2.wards 可以 rely 其他人(usr),并使其同样成为 watds。

3.可以限制函数(auth),只有 wards 可以执行函数。

例如,MakerDAO 的 Vat.sol 合约中的 fold 函数可被用于更新利率累加器,并且只能被其集合中的另一函数调用(Jug.sol合约,drip函数)。如果我们观察一下该函数的话,便会发现用于调配的 auth 修改器,【文章同步发布于漫兮网:https://www.manxinet.com】

从某种程度上来说,auth 和其他调配实现是对 private 和 internal 函数概念的扩展,仅适用于在合约间进行访问控制。

MakerDAO 与我们项目的实现方式非常类似。

1.合约部署者是 wards 原成员。在 Yield 中,即 owner。

2. wards可以 rely 其他人并使其成为 wards。在 Yield 中,只有 owner 可以 orchestrate 其他地址并 authorized。

3.函数受限制(auth),因此只有 wards 可以执行受限函数。在 Yield 中,我们提到 onlyOrchestrated 地址可以调用标记函数。进一步限制对函数的访问。

除了在Yield中使用了两个访问层(owner和authorized)以及函数限制以外,二者的实现方式是一样的。可见,合约调配是一种一经实现即可重复使用的常见模式。

从审核员和用户的角度出发,我们还开发了一个收集区块链事件,并展现合约所有权和调配图的脚本(可以在上线时通过我们的网站获取)。

【文章同步发布于漫兮网:https://www.manxinet.com】

总结

智能合同的调配是一个在很多项目中反复出现的问题,在遇到此类问题,大家往往都会从零开始进行调配。但其实此类问题的解决方案都是十分类似的。

我们可以遵循以上标准来实现安全有效的调配,希望大家可以深入理解文中的示例原理,并形成适合自己的解决方案。

solidity 合约权限授权_智能合约的调配模式:如何让你的智能合约安全协作?相关推荐

  1. mysql导出权限授权_本文实例讲述了mysql数据库创建账号、授权、数据导出、导入操作。分享给大家供大家参考,具体如下:1、账号创建及授权grant all privileg...

    本文实例讲述了mysql数据库创建账号.授权.数据导出.导入操作.分享给大家供大家参考,具体如下: 1.账号创建及授权 grant all privileges on *.* to 'yangxin' ...

  2. 什么是智能合约 区块链_什么是区块链智能合约?

    什么是智能合约 区块链 关于区块链智能合约的第一件事是它们不是智能合约,或者不是区块链上的合约. 实际上,它们的名字是奇异的. 1 ,让我们将按照相反的顺序这些问题,我们应该搞清楚一个聪明的合同实际上 ...

  3. 权限丢失_应用好深圳RFID智能档案密集架,杜绝档案丢失!

    应用好RFID智能档案密集架,杜绝档案丢失! 档案丢失问题一直都是各个档案室管理档案工作所能遇到的头号大敌.档案丢失的性质可大可小,杜绝档案丢失问题是档案管理工作中的重中之重.如何有效的杜绝这个问题, ...

  4. 为什么合约权限放弃了, 还会 貔貅

    为什么合约权限放弃了, 还会 貔貅 1.下图可以看到,在区块浏览器中,执行了 lock 方法,进行的合约所有权放弃,称为 权限假放弃,意思是 只锁住一段时间后,就可以找回 合约的权限了 2.下图可以看 ...

  5. MySQL数据库的用户授权_查看权限

    文章目录 Mysql 的权限分类 权限数据的存储 每种权限的修改策略和作用范围 刷新权限 MySQL 提供的操作权限 授权语法格式 参考示例 授予用户拥有某个数据库的全部权限 授予用户拥有所有数据库的 ...

  6. MySQL权限授权认证详解

    MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍 1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删 ...

  7. 埃里克贝里奇_未来公司客服的标配?苹果Watch智能手表开启新时代

    在大约1400名受访者中,超过三分之一已经开始在工作中使用可穿戴技术.绝大部分受访者(86%)都计划在明年花更多钱来购买智能手表.系带.手链和眼镜. 智能手表能让你的销售或客服团队更敏锐地把握客户需求 ...

  8. 数据库中,把角色的权限授权给用户总是报错,角色名附近有语法错误的原因

    摘要:微信搜索[三桥君] 软件:Sql server 2014 一.问题 数据库中,使用GRANT<角色>TO<用户>,把角色的权限授权给用户总是报错,角色名附近有语法错误的原 ...

  9. 智能测温工作台、健康打卡、智能助手、防疫测温、体温监控、组织架构、模板监控、设备管理、组织架构、设备数据、设备监控、应用管理、企业管理、目标管理、文档说明、业务流程图、账号、权限、发票、axure

    智能测温工作台.健康打卡.智能助手.防疫测温.体温监控.组织架构.设备管理.模板监控.设备管理.组织架构.设备数据.设备监控.应用管理.企业管理.目标管理.文档说明.业务流程图.账号.权限.发票管理. ...

最新文章

  1. 三星在研发VR一体机?眼动追踪公司曝出原型机
  2. 把java当爱好_(观点)如果把爱好做成职业 把职业做成事业
  3. Excel中的VBA宏:每次划款前从总名册中同步用户数据到当前页
  4. OpenCASCADE绘制测试线束:OCAF 命令之通用属性命令
  5. 计算机应用基础2010版知识点,2010计算机应用基础选择题(含答案版)重点.doc
  6. C++数据抽象和问题求解(第6版)
  7. vue全选和取消全选(无bug)
  8. Ubuntu 18安装谷歌浏览器
  9. python中append和insert_python append、extend与insert的区别
  10. 元素内容必须由格式正确的字符数据或标记组成_字符编码是什么?html5如何设置字符编码?...
  11. 对象转json字符串(带转义字符)
  12. 联想IBM笔记本驱动
  13. ttf字体转换成woff2网页字体快捷方法
  14. Linux resolv.conf 简介
  15. Selenium实践-拉钩网招聘信息
  16. 软考—信息项目管理师(信息化和信息系统二)
  17. “当前不会命中断点。还没有为该文档加载任何符号“解决方案
  18. ConcurrentHashMap(jdk1.8)讲解及常见面试题
  19. 蓝桥杯 —— Web前端(数据交互类)【标题即题目链接,点击查看具体要求】
  20. 用python画气球_452. 用最小的数量引爆气球(Python)

热门文章

  1. luogu P2018 消息传递
  2. centos7邮件服务器SSL配置
  3. Bitmap对图像的处理
  4. |Vijos|图论最短路|P1082 丛林冒险
  5. 翻译 - 【Dojo Tutorials】Getting Started with dojox/app
  6. Mysql中添加汉字乱码无法识别问题
  7. C++_sizeof关键字_实型(也叫浮点型)---C++语言工作笔记011
  8. MyCat双机HA高可用集群搭建_Keepalived安装和配置---MyCat分布式数据库集群架构工作笔记0029
  9. Netty工作笔记0044---scheduledTaskQueue
  10. STM32工作笔记0063---PWM输出实验