Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

浅析智能合约中的沙箱(Sandbox)机制

扯题范儿
116 0 0
了解区块链技术的童鞋都知道以太坊的智能合约都是在沙箱(Sandbox)中运行的,那到底什么是沙箱呢?为什么要在沙箱中进行呢?下面本文就为大家一一介绍。4 u7 ^6 }2 a9 I

  n5 B  {  F7 S$ ^! D: S    1.为什么需要沙箱机制?. o0 }( T$ i  t$ K
8 T6 T- n! @' n7 O6 X9 d. |) D
    默认情况下,一个应用程序是可以访问机器上的所有资源的,比如CPU、内存、文件系统、网络等等。
5 o3 E& X  D6 _) B& x/ |9 V
4 f' \  }0 i8 u' G: Y+ V3 F! n    但是这是不安全的,如果随意操作资源,有可能破坏其他应用程序正在使用的资源,或者造成数据泄漏。为了解决这个问题,一般有下面两种解决方案:
+ l" f( ?0 l( B- F) v3 ^3 w% M- t8 N1 l
    (1)为程序分配一个限定权限的账号:利用操作系统的权限管理机制进行限制
5 V! _, f4 m+ G, L
% T: i1 O% j9 W3 N    (2)为程序提供一个受限的运行环境:这就是沙箱机制* @8 H+ B2 S6 A, Z. ]$ [

! X  \2 ~' B  j" k    2.什么是沙箱机制?
& k5 @+ k& h9 i: ?  }5 {
" r" I. C2 B7 }$ ]; T' {$ l$ d( s' G    如上所述,沙箱就是一个限制应用程序对系统资源的访问的运行环境。$ l8 e: [. @$ J" m3 N% I( ?" o

% g3 ^1 h0 s+ @: Y    沙箱很多情况下都是实现在虚拟机(VM)中,比如Java的虚拟机JVM、Javascript的虚拟机V8引擎、Android中的虚拟机Dalvik/ART,以及以太坊的虚拟机EVM等等。具体的实现方式各有不同,本文重点分析一下JVM和EVM的沙箱机制实现。
' A. @* Y/ K0 T" q- }7 {/ |% N$ n+ C, t* x- S9 q. n/ O
    3.JVM的沙箱机制
' \; D9 m5 m4 F4 J' F
7 w. I8 V8 @7 K- K" W    第二层:字节码校验器
4 O4 t. {" a0 i8 J/ {5 Y( B& n7 L+ H; V3 X3 [+ k6 h! M  o2 G% Z! t
    类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:
- i( h6 m! B7 |' h% _
4 O0 {' `4 o% J5 G. O    (1)变量要在使用之前进行初始化
0 l. a7 h1 b0 C# A; e
+ O$ K' K  o9 ~/ r$ ?    (2)方法调用与对象引用类型之前要匹配9 W- d, o5 N9 P6 p( W9 Q

. ~6 f( i( e! R0 u" U0 D    (3)访问私有数据和方法的规则没有被违背) e* Q. z$ H7 l! |( N
' Y) X  e9 Z5 X/ `, a5 z6 R
    (4)对本地变量的访问落在运行时堆栈内
4 ~8 o+ j$ R, G; p) V5 `% D1 S% m" A6 Z7 |% G  |: T
    (5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。
9 i7 D' s, ]; K  I. E7 S
, B+ F4 S' h+ c1 h, P+ H# ?, Q' q6 D9 m( ]    第二层:字节码校验器5 Y& P5 Z3 ~; I( _( @9 C( k  g% y8 a
" v5 r/ W3 J" Y$ G8 I/ E7 b
    类字节码被加载后,需要在字节码层面进行检验,具体包括以下内容:6 ]7 \) h7 d! f% S
% r6 _; F6 _$ X( w) s2 x
    (1)变量要在使用之前进行初始化3 \5 ?; Z  l9 E4 y+ C/ t
( G8 R* c9 |; S6 h0 d7 d6 H
    (2)方法调用与对象引用类型之前要匹配+ D, y) I* b; ^- H0 o
! o* C& a7 h& ^! Y- t; V
    (3)访问私有数据和方法的规则没有被违背
# Z7 D, V7 G  {2 R6 h1 R! O5 p. x; j5 ]0 w  `6 S+ F, |
    (4)对本地变量的访问落在运行时堆栈内. W# I; U  G# j7 b& V  ?% @

  c3 g* ~! P2 H  i: y    (5)运行时堆栈没有溢出通过这一机制,可以确保字节码符合Java语言规范,避免访问无效访问或越界访问。
! N$ G' \# _, }6 t6 G: t) K3 J2 H& W6 o" P6 e0 t6 s
    4.EVM的沙箱机制
3 O0 P4 O' J- R* V+ w
* ~2 F4 p$ |+ C    EVM本身是一个相对封闭的环境,不支持对网络和文件系统的直接访问,从这个层面来说已经起到一部分沙箱的功能了:
6 q# R3 N' B5 c* z4 i
8 z) i2 X' Q/ v* r% O$ p# g    另外,在智能合约之间互相调用时,EVM会重新分配堆栈和内存空间,在一个全新的环境中运行新合约,即使出现问题也不会破坏原有执行环境,从而为智能合约的执行提供了一个沙箱环境。* s3 r; a' G9 ?5 \5 S  A' J
) t  p" q8 |; @* Q  l3 J, w
    最后,每个智能合约的存储也是相互独立的,开发者可以根据需求,限制合约可以访问的存储空间,避免未授权的访问或修改。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

扯题范儿 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1