Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

以太坊智能合约的生命周期

kknini2
74 0 0
####第一站:合约存储
2 E8 K4 z1 P6 ^, d2 k7 x; i5 G9 x/ k7 R% z  E& q7 r, L
    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
3 f- D) {6 f2 q, s' K& U; C
. d7 U# r' O/ z' B' q# V    -以太坊上两种账户类型:a)个人账户b)合约账户-
+ C$ P  j* x6 s$ _+ \2 |
* Y& r/ M5 s% j# o& ^6 B# P5 P& y    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。5 \( h- \+ _; l1 z& ?* v: b

0 F6 R5 s3 x" I& ^    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。8 U+ ^$ r0 G4 [! O3 H
2 {/ Y% Q% s) [$ H3 J
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。$ J! H, b+ i3 k& V
( _  G! N: p+ M0 D9 W
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。% W" n0 c6 q4 Y0 ]3 X
4 X3 ], N' q  n1 a& @% o% k  O* n  }7 c
    ####第二站:合约创建
) w% p; V6 [; @0 d  [$ k4 U2 q8 F) _7 ^. ?, g! }
    这里我们用用户A的例子做说明。& X& T% y: R1 j# ?; K* |" J/ Z

# b; e# N- O2 F3 v; {. {3 x0 ?) p    用户A使用solidity等语言创建一份合约代码3 ]$ \* }/ [. N  M$ S; {/ h

5 f/ e" T8 I! C$ q' |/ n    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)1 N' Z" S' y( o

% H; l+ \+ z$ B3 }8 x$ d    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
' L+ V  ^+ m$ L2 e: {* w
& j6 O+ r: H( H9 K: f5 l    该tx广播到网络上,B节点收到该tx。
+ H) R& t  b6 z* J8 s& ]1 y% `8 r0 i0 Z; w
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。- {0 t( \6 A: K9 U5 A( J
* S- F3 n$ t0 D# T( d' M1 I( g
    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。
- T/ x$ f% m$ ^. G7 o" S
2 L" M0 q# G, u% A+ T+ s5 K    ####第三站:合约部署/ b4 a2 g6 f; [+ G$ e/ Q2 F

! r. x+ D  I2 t* n) W' `# L" p    我们加入矿工B和C。$ D5 q# u# O  u5 O8 r
1 ]: M/ t+ d: U
    -部署与挖矿过程-9 p/ A. ~  p. i& c* R' u
+ H4 K7 h9 L' E3 v5 i9 |- n
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。$ D) g. X' R3 X. E& J

  [; u5 C* v- O8 C) W    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A
- ]4 B8 N9 t6 [% R# U4 W
% |% g0 @  E6 B5 p' Z- }$ [- r; F6 k7 R    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
8 O4 c. h/ `% T: o( U" F4 h1 p4 n. G2 y& s4 S7 N9 {; ?! A4 U
    C接收到该区块,验证区块,如果区块通过验证:
5 B" q6 Z& d$ i' p3 D, B/ H; s
! K5 t+ r7 Q% g: ^    a.C从内存池中删除A创建的智能合约交易请求5 C2 N+ R3 z1 [" f# O( s
) R. U: a  T* f- M2 r& s
    b.C将区块链接到本地最长链上(同步区块)
$ U6 w/ p) g* {. n3 l2 m% k" c8 w7 ~0 E4 F
    c.C将A的智能合约部署在本地区块链中。& Q" u/ v/ D* I2 k  D: f

' C- v5 \- U& ~; W0 C4 B0 g    -区块验证过程-" M/ G3 E1 [. c; V

) a, @+ `$ @# `) Q1 B  Y  a" n( ^$ P( B, a    ####第四站:合约执行
" `. d, r: L" ~- ?8 M8 o* r) R9 [
5 V4 r$ P7 q) m+ s/ X# c5 h- \: _    -合约执行过程-
9 P2 [2 F# W$ ?) R4 B4 y; q, m: K% t7 E4 `) V5 B4 N# M7 W4 q4 }' z) c
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
! f2 h' j; p/ y3 V8 R0 V4 l8 x* A; d) W! Y
    B同步到此交易,检查交易是否有效、格式是否正确。" E6 Y5 ^! F2 L; T$ ]& V' s/ ~7 ^0 J

/ r2 U. J' F  s' l; a    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
$ j6 V& _) R# y0 U6 P8 }* ~, K$ J7 W! V& h/ d% n9 I
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。
) G% ]' P. Q; p2 N/ y" n
: z( w# M# |0 @. p+ A/ h7 U. F    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
+ \* V5 b3 B0 |" j* i
3 L3 x) e9 w# m/ ?    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。- Y7 ~+ o* R$ S! c0 {

2 u0 x3 n1 |! V. D4 H0 L    ####第五站:合约升级
0 B1 W' r! m7 g* L1 i" W+ B4 v( B' L3 k. o% e$ U
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
3 k  g0 Q/ L+ s# F* ?& k
; V$ q! X' y3 `5 V, q' `6 b    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。. _8 m( S( m! |

' \( E. R+ F5 P4 P/ q    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。+ p, P7 Z2 P: `$ g: b+ V
& Z+ T) v3 y! l/ |
    ####第六站:合约销毁
' I1 P% q4 }1 [6 y
2 i/ c- `9 S3 z. ?1 X    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:4 s7 h# q: m$ p% |2 B* k, D/ p
3 [. y% S, Q. |9 r8 ]7 w
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
9 @  L* a7 {1 A2 f: c# c
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
4 t9 S# ^( ?* y8 e" l5 j# F0 n; [1 l+ R
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1