Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
115 0 0
####第一站:合约存储/ P% ~* E, G; \2 r' Y' d: q

2 c+ X1 [% P  C/ o+ {    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:/ v' G* a$ U, O0 e6 n. B
/ I5 i* m1 v/ B3 |( a  H+ D: n( m
    -以太坊上两种账户类型:a)个人账户b)合约账户-8 K: m3 ^% e- r4 J" p& p4 |

& m6 r. {( |. z- ~1 |6 a    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。: e, V$ |0 F& Q8 ~  [. q

( U9 k0 j( r8 u    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
( m% G/ `- M  R
4 l+ X% u1 t, s' \/ u% D: Y: Z    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
/ ]9 p% J0 e9 p1 ~/ e  w. ~( F" H9 b. J" P( W9 B, J6 @
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
( E2 O3 c5 p2 U9 F/ o0 }6 v' m* x1 D/ _# e9 R1 f) ?3 u
    ####第二站:合约创建
$ {: S0 K5 t: T3 O$ [' W) v9 \  }& T$ z1 j- w, |7 P" K/ N7 H
    这里我们用用户A的例子做说明。
: ?' @$ ?: k6 N$ u+ X
5 o. b3 [3 s8 Z: ?, C+ c0 x. Q$ o    用户A使用solidity等语言创建一份合约代码
+ j; S* T1 b) Z+ D% a* P. w9 O& y1 m1 _: ^& [% W! A
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
6 Z% y& Z% h& V5 z7 F
. H  \. u: B0 Z9 Z& o* @    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
/ i: J/ R' X3 C4 p/ @, h0 O+ f% E8 a* N1 a
    该tx广播到网络上,B节点收到该tx。
; u* P) u6 ]- g+ f/ H& q, e6 Q$ H/ p+ u' _8 f
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。2 ^# w$ a% {) [  \2 }

- [: V* H2 U  i6 k" h8 I    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。, k- D+ M8 n. h% _6 T

6 M6 R4 `9 x  O0 x6 S/ j5 |6 L    ####第三站:合约部署* f  T; @% c  y4 j8 b0 i) ?8 ~

, w; q, V3 e  W- G    我们加入矿工B和C。. O$ c3 R& I/ }. g

- ~6 k" k* {9 q5 i  D( F% N    -部署与挖矿过程-
# n/ e! D" V8 P5 B$ A4 x8 A% {& ?. L( t# U, C5 g. J
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。
: Y, A( ?" t$ q0 _5 @, B* v# y+ O/ J/ ^1 G/ Z& r; J% ]' P
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A. p% ?6 D0 j( B: K  h5 k$ C2 A1 v; o8 q
6 Z: n  y. w6 M$ _' s
    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。9 C- M# ~5 U, `/ D$ H" D. A
( O4 O- L) B  h: Y! n% |/ O+ W
    C接收到该区块,验证区块,如果区块通过验证:
# b2 o$ a" L# ?3 v6 _
, u! P- z' h8 G" \    a.C从内存池中删除A创建的智能合约交易请求
0 n. h. _8 t) d2 M9 Z8 R; ]4 h/ d& _  G/ J5 g; K' m  b
    b.C将区块链接到本地最长链上(同步区块)
% Z$ ^+ d: r1 c
, V) k6 F: Q1 G4 h( a. r1 d( C$ Z    c.C将A的智能合约部署在本地区块链中。( i# U% g: _8 a5 M
, @9 c; z2 o" ]& l% `& F
    -区块验证过程-
1 x6 i: w5 K. j
1 j( u' \2 U$ k* s  J    ####第四站:合约执行
2 Q( t  Y( h& V8 f* o
& k! c& V0 ?! p2 I4 K) b; |    -合约执行过程-7 O5 h# ^. _/ ~! o

6 C3 l3 i4 Y. c9 A5 K. `    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。  X+ \4 x: k( _+ R/ c4 O

/ k( H; Y) M- h9 @    B同步到此交易,检查交易是否有效、格式是否正确。
/ d5 p& {% Q" O5 ]' M/ p
5 d  ?; M- Q. p3 x! g+ C  I0 W    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
( [* Z' m# L" r: e
- e3 m, x" \2 v, j% K+ ?, ^9 V9 |    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。/ V6 G8 _. W3 \9 v& M

+ |2 @( z, d/ [* j7 j0 w    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
: U9 G  C7 m( V9 v5 y& B( m2 ^7 p7 j+ [2 e/ E$ q+ e
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
  o+ z/ y: K/ \( d0 T, O8 ]( G' [! i
0 |" d2 \: r" \2 W3 b    ####第五站:合约升级+ e% N& ]0 S4 e; n2 I
& i; U4 n% \8 V9 _* X0 p
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
: G: K! M5 ^" x  ]( P( W, U3 Y' `& \0 N3 H
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。
2 |2 O6 r( i" N
+ s) S: Z: A+ t0 p+ B" G* t    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。6 H  w) b( u, Q) n1 c0 L3 [: Y  V) B2 j
# l8 }) g$ o, G0 v: e% z; ]
    ####第六站:合约销毁  R& M7 _5 s$ y& w

: Y/ U& a' _1 M' X    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:7 v' O6 u( X2 r9 {4 [/ s9 Q9 a& T
- C. n8 r) c5 ]: U5 e+ n
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

' ?: G$ q: m' w3 `    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
5 U& g* I, h% p$ W
# G! u$ v7 u7 ~: ^- d! A& u, J) o    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1