Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
72 0 0
####第一站:合约存储
' J- k! }, b9 a7 z1 B. K
3 w. I: s- E3 I    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:) }. \% ?9 A' ~9 \7 Y2 a
$ d! j6 m; r1 a0 z6 K2 M1 ?
    -以太坊上两种账户类型:a)个人账户b)合约账户-
/ d! k2 s  j- k( H# i$ A$ ?; ~+ U2 B' Q
    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
4 {1 Q8 M, u$ j% E# |1 w; I6 x; D" G* m! U4 @- ]+ n
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
: G! u' a6 W0 |4 F. N9 M' Z& i, f5 G* C9 f/ @, e! ^6 e
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。/ O7 l8 Y. R% Q

& O, c' ]$ l/ Y0 f) C6 t- l$ c+ T    最后,所有的基础存储目前都基于leveldb,一种kv数据库。* D1 r6 I- l) ]

' F6 @! m" V6 S1 r" V    ####第二站:合约创建# M2 V- v" J2 e

: U) x4 |" Z) s1 ^; D/ P    这里我们用用户A的例子做说明。/ b4 B: Y% R# J! U8 w) b9 b0 Z1 q

2 l# V, Z0 _- ?    用户A使用solidity等语言创建一份合约代码; c" I& z; o7 Q- C/ Q1 o& d
  }( C$ E$ K! n
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
& G% l6 F5 v7 X0 M/ C3 j) r- G( h0 ]* _3 k1 L( s! ]
    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
  l. ?3 D- \  i4 S# ]0 D! H) @+ O' V% i$ ?, E+ E
    该tx广播到网络上,B节点收到该tx。0 Q. l3 r7 A4 ^3 r

9 U) w4 }4 @% e7 i    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。8 |$ P3 i" k8 R) p9 j; U
) ~( F/ B) a5 C. k8 T
    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。
( _# _/ ?, U! `2 N- K: X2 z) c1 `/ y
    ####第三站:合约部署( R, V% t2 |% t  @1 t3 R6 e

: n2 |2 k1 B: s    我们加入矿工B和C。9 p4 s' c( ^1 t

) I) R- s" o4 u    -部署与挖矿过程-
+ y: T! K0 E/ z- }/ S6 G: q  o  w4 r
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。" N$ w; a- J* S$ S2 @

: U& v. k, T* G4 ]3 R- y    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A" g. C% z7 s1 P

) s$ R+ S1 z) ~5 \# \    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。. m) u& K) i% ~5 \$ v: k2 n8 N, Y

- ]% }, T4 e7 F* @6 B3 J  ]    C接收到该区块,验证区块,如果区块通过验证:
# x. l: Z4 {: O% r- Q. z4 B8 ?* R
    a.C从内存池中删除A创建的智能合约交易请求
+ ~3 t& _6 T$ E$ c! C: \+ e2 o
( l! z# |* c; ?# k: N    b.C将区块链接到本地最长链上(同步区块)
# I3 b, V( n' y$ j
% ^9 Y5 p- h' k- h( W7 ~( G    c.C将A的智能合约部署在本地区块链中。
; ]1 W; o, T/ c6 @5 ^
) X8 u! b# [0 c& x2 \& W5 f    -区块验证过程-, t8 W# m  o  J" \1 T  X0 t

' {5 M) L/ N( I) I2 p3 S3 h' g' T9 c  ]    ####第四站:合约执行% M0 P2 e" Q. J  n
' n. a! v6 ]" N0 ^) y
    -合约执行过程-5 e7 n6 L" ]4 ~" _, ]' F/ [5 n" \

0 n! X. d/ U7 z0 L; C8 Q) X    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。7 S; N+ Q5 F9 m

8 W% {) O; n0 g& g    B同步到此交易,检查交易是否有效、格式是否正确。" D+ g; {9 h$ K( P* C+ }. ^
$ u7 t) q& O' `0 A
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
) I% H# O2 O+ R8 _: y5 a$ r2 X" Q, ~% h$ Y" d; `
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。$ G/ r' ~4 U5 X$ D6 W3 {9 O6 V. v

- L. K, G& I0 `+ x    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。# q  |) @4 f* u' C5 @2 H; M
6 K* o% ^$ U$ |8 T% X' M$ k+ s
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
' w% q0 `6 o/ o6 I: ?- y7 _! Y1 U* J0 q8 y
    ####第五站:合约升级: A$ L: N- Y' @1 Z: E" [' F

( m9 h* h) k& X/ ~. c7 |    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)' h3 t+ A6 n; @9 o
: `# W1 c' Q* v. Q+ Q
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。) o6 [8 D8 r4 t) Y7 K
* z8 m0 T* H" {: ~: S0 E: ?6 Z0 u
    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。% t( N* i  q/ e) T& l) P3 E
: v1 O2 x2 P. @; H6 Q/ \
    ####第六站:合约销毁' X: \" w) L- [  N+ R

/ ]9 c, \1 e9 ~- b7 _    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
2 p0 L7 J# N3 l7 t4 y& i; z  K8 s& r& P. s1 j
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
$ i9 q+ x; O# Q  {& H4 i' w* b
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
" [& ~" V% P. ?3 _% S. H* S
8 v. t: ?9 \( w) R    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1