Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
75 0 0
####第一站:合约存储0 |( D* x$ O$ Y

: |8 G; m) I. _( t) K; |    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
, n# M" d( F8 X1 K  t+ L" a8 V2 \2 w0 H8 k: e' T9 H
    -以太坊上两种账户类型:a)个人账户b)合约账户-) d4 B: `! D& s. H( {2 k
0 r& D, {7 E7 {" ], E% ?' S; @% D8 N% Y
    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。, }  A1 O9 K( G% C

* g' _& @7 |- e% `- u% Q. o* G3 o1 _    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。( B  }) {2 b$ i& x  j/ Y
/ r- u) C& c# g8 O1 t. v0 v3 K
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
5 l; E% s: s$ S9 v0 j3 b! J' M& `, V+ t2 S3 O
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
9 h' d' b+ v, ~3 Z' _, h2 B1 g
! W) {6 Y. Y% H5 Q3 n4 a+ T$ U    ####第二站:合约创建' |% g: s% L" u; T

" i9 h6 s9 n1 A    这里我们用用户A的例子做说明。; L: H+ O: @# P6 e
) {7 A* x3 w) v4 ~& a
    用户A使用solidity等语言创建一份合约代码
" m6 ~+ u% v' M
: Z! e0 C4 A8 B+ T    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction); {$ S% [$ Q" D! c' `. {
7 J& L; l1 f: d# p
    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。) \% f+ i' y1 v9 J! S2 E

: X7 x8 S" R  v: r. Q! w) N    该tx广播到网络上,B节点收到该tx。, {* ~( G- s7 ~5 A
) b% A+ t/ B5 O/ ]2 A
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。" O; q2 c- G1 u. b( F/ P

7 m. C& e: m1 f6 ~9 C    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。6 F1 D& _$ Y& I. ]" l

& o: z. u( L; L6 C    ####第三站:合约部署9 Y& D" V  @# z2 g9 @
  ^9 g1 o, g: R/ S7 |
    我们加入矿工B和C。
, {# q7 |3 }) l' F, z0 B: T4 @! T9 c: t( S/ z, n2 b- d
    -部署与挖矿过程-( y6 C* r3 H4 q& E# g9 R0 v8 j

  `% t1 ]7 |3 `& {( R    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。7 g$ W2 c; W. L. ~$ L" Q; E* ^

! F, f. C, n) K. R  A1 F    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A
, a4 w" Y& o) d" o4 P& c; I) B' z. q5 D( c" K; F
    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
8 j5 W2 C  ~( v' ]) Q9 s
- o4 N9 J" F8 j- b    C接收到该区块,验证区块,如果区块通过验证:
1 w, C4 A0 W% q7 x0 ]
$ _! l/ T% m+ q  i    a.C从内存池中删除A创建的智能合约交易请求
* @# w' e6 S% d4 z- O+ E
* [9 r, x8 [. }5 n/ o. d0 q, p    b.C将区块链接到本地最长链上(同步区块)
. m7 W% V! N/ @8 k8 c+ @
" L* I3 B4 k7 n0 W, f8 Z    c.C将A的智能合约部署在本地区块链中。
6 H' a, V' y. d! W0 R# z7 [5 [% `6 q. d, |
    -区块验证过程-
( A: R  [' D9 j4 _0 ?% F5 b
: h; B6 J- c$ |4 J. g    ####第四站:合约执行
0 u# |- d5 g) b1 Y0 v  c- L. ^. k8 p% g/ j8 `3 ~
    -合约执行过程-% T# W1 d. S( W* X: ~4 v$ P* K# P

2 C1 [6 r$ r. }# o    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
% r/ D* L+ I& Q( u" o+ R4 a
: }; g% y$ S: P- ~    B同步到此交易,检查交易是否有效、格式是否正确。3 `3 a9 \; f" d+ ~# Z
; v9 M5 G8 p* @
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
' b: E6 P! B  T
# Z# o, s; I  d; h& q    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。5 {+ l  j5 o# t, E2 t; j; ?
# y7 N( p7 `( U8 ]6 x4 Q
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。7 r. @( y/ k4 M' n1 l& e" u" E
7 t" x3 u8 t2 ^0 v
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
& D* [9 S* G) \7 D2 w+ `% f- B" z/ J; ]8 _9 u6 A( O  a4 F5 f" c
    ####第五站:合约升级
' F/ r0 e4 b2 _5 H2 Q# A3 j
2 t$ z/ Z6 }; Y3 ~8 k: T& J) s7 f    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
6 L! j' J0 j( L" A" y4 c9 |$ H5 H  }& O9 q" Y
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。" _- _; k0 }* ^
- p5 ?& u& D# D% u. l
    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。' ?8 M/ h" K+ ?5 L2 a: }( B
1 N$ n2 B7 U, r. u- ?6 `3 s# J$ w- a
    ####第六站:合约销毁0 ^2 Y) |0 y$ ?

! R& E5 I! m2 Y9 O7 [; W    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:$ b9 C7 f( ?8 t" u

5 t" @% T% q* o$ w1 s2 Z! C    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

1 H$ s: y& X7 @$ o8 [0 V    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。, c  R+ F7 b: S1 y
- A; i6 M' g3 e
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1