每个人都可能听说过以太坊的智能合约正在沙盒中运行。那沙盘究竟是什么?本文将带您了解这种机制的奥秘。
1.为什么需要沙盒机制?
默认情况下,应用程序可以访问计算机上的所有资源,例如CPU,内存,文件系统,网络等。
但这不安全。如果您随意操作资源,可能会损坏其他应用程序正在使用的资源,或导致数据泄漏。为了解决这个问题,通常有两种解决方案:
(1)为程序分配一个有限的帐户:使用操作系统的权限管理机制来限制
(2)为程序提供有限的操作环境:这是沙箱机制
2.什么是沙箱机制?
如上所述,沙箱是一种限制应用程序访问系统资源的操作环境。
在许多情况下,沙箱在虚拟机(VM)中实现,例如Java虚拟机JVM,Javascript虚拟机V8引擎,Android虚拟机Da高仿lvik/ART和以太坊虚拟机EVM。具体实现方法不同。本文重点介绍JVM和EVM沙箱机制的实现。
3.JVM沙箱机制
JVM的沙箱机制大致可分为三层:
第一层:类加载器
使用父代委托模型,当低级类加载器收到类加载请求时,需要将其委托给高级类加载器区域来完成。只有当高级类加载器无法完成请求时,才会将其重新委托给较低级的类加载器。 。此机制可确保系统的核心类不被篡改,并且恶意代码无法访问关键资源。
第二层:字节码检查器
加载类字节码后,需要在字节码级别检查,包括以下内容:
(1)变量应在使用前初始化
(2)方法调用必须与
之前的对象引用类型匹配
(3)不违反访问私人数据和方法的规则
(4)对局部变量的访问属于运行时堆栈
(5)运行时堆栈不会通过此机制溢出,这可确保字节码符合Java语言规范,并避免访问无效访问或越界访问。
第三层:安全管理员
该层由应用程序开发人员维护,开发人员可以根据自己的需要开发相应的安全策略。默认安全策略配置位于以下两个配置文件中:
·$ JAVA_HOME/conf/security/java.security
·$ JAVA_HOME/conf/security/java.policy
默认情况下,未启用安全管理器。您可以通过在命令行中添加参数来添加它:
Java -Djava.security.manager SandboxTest
默认安全策略配置不允许应用程序读取和写入文件,因此如果您尝试编写文件,运行时将报告以下错误:
如果要打开此权限,可以编写自己的安全策略文件,例如,我们编写my.policy:
然后在运行时指定此策略配置:
Java -Djava.security.manager -Djava.security.policy=。/my.policy SandboxTest
应用程序开发人员可以针对不同的应用程序场景自定义应用程序,并控制程序对网络,文件,属性和其他内容的访问权限。
4.EVM沙箱机制
EVM本身是一个相对封闭的环境,不支持直接访问网络和文件系统。从这个层面来看,它已经发挥了沙箱功能的一部分:
此外,在智能合约之间调用时,EVM重新分配堆栈和内存空间,在全新环境中运行新合同,即使出现问题,也不会破坏原始执行环境,从而提供执行的智能合约。沙箱环境。
最后,每个智能合约的存储也是相互独立的。开发人员可以根据需要限制合同可以访问的存储空间,并避免未经授权的访问或修改。例如,下图描述了存储空间访问的CALL和CALLCODE指令之间的区别:
来源:公共号码(DoraFans)