Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
113 0 0
####第一站:合约存储
- u* z& S1 R, c; ?1 n. j( ~6 W3 X
! m# @$ [* g3 M  C  o. T    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:0 k! Z! ^  e2 O/ c, [
0 _1 G) a' S& c' a
    -以太坊上两种账户类型:a)个人账户b)合约账户-
+ p- c- O6 E# t7 L4 [4 R
* I2 o+ l7 ?- N5 B3 M$ T    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。3 }: a7 e& d2 Z3 w* a
/ n/ j) d/ [4 U+ l$ C" R
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
3 t# t1 K* {# j9 P6 \( m8 S1 a4 o7 ~$ @, Y3 \
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。+ P4 R' z. H( o& L/ Q

7 Y% M/ R: t1 g5 I+ P    最后,所有的基础存储目前都基于leveldb,一种kv数据库。4 T& W8 t0 }! w- Z7 h

4 D' _* [- T! ^9 W0 C4 H( w% F) z) e    ####第二站:合约创建% d2 Q2 o% Z% Z; E7 F: @
" t1 j+ D; M* D3 `; l4 A- V) L* W
    这里我们用用户A的例子做说明。% I" ]. H* d4 n1 a5 [5 ?# P, L+ c5 l

1 E+ V" e  c* \$ D- r    用户A使用solidity等语言创建一份合约代码
1 `% t: l. ^: S# L: c1 e' y& n- G! R4 d- u) z7 U  l7 Y' o# [
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
  \$ L1 C4 R7 A8 \, K
) }$ W9 m& f8 h+ K- \    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
- J" x+ g9 I& T$ X1 g7 Y4 t
5 v5 H# ~& M  A" T    该tx广播到网络上,B节点收到该tx。
# z$ x9 [4 x9 w! Q
/ N* ?. x1 X! S9 n; b    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。  ^- M; ~3 [6 ?9 v5 Q" J4 j

# h) @* z* X$ H7 s6 i# r# d    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。  X0 _, {0 c, t5 }: D4 _+ o

% U" A# c+ }/ |9 T4 i  y0 Y) b    ####第三站:合约部署
. r% W! c2 i" ~
7 p! W  }$ v' b9 B/ H& K    我们加入矿工B和C。
& A1 ]0 A% F3 y* d1 M
! p- \  W! p' p# P    -部署与挖矿过程-2 B+ ~  Q/ f7 B* ?) i1 J! V

- @" P( n% K  w. h. ?    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。- n$ i7 i- z$ C2 B2 J7 m+ Y
7 G7 A8 P9 ?+ A! Z! L
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A' W! T; n' G' a) p& z1 j
( z% d$ H' t" \( q7 l* S7 `
    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
7 c8 h' P( F" m- t$ t
( o! ~- F* \# x1 D    C接收到该区块,验证区块,如果区块通过验证:
2 U; }1 H6 c& u  `# t
! Y, a6 c3 Q9 @5 L    a.C从内存池中删除A创建的智能合约交易请求0 g% R6 U% S- T# Y" b  w
: F# ?% `: x9 V7 Z! c
    b.C将区块链接到本地最长链上(同步区块)
: S# V  v, A6 M: W  x- ~, V% ~' B
    c.C将A的智能合约部署在本地区块链中。/ D( f' }# n* O3 n' z: J

* Z3 n$ J  k9 v6 x    -区块验证过程-
7 l+ |5 d, o, Q9 n: B  _
9 b2 [2 ]5 O9 M  d2 G* K    ####第四站:合约执行6 W/ X' q0 g: x; Q/ k0 @4 P# [

$ W. X& Y% |( c( C2 R6 \    -合约执行过程-9 g  E* F! C' H- z, |
" D9 }0 w# r! b/ m
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
0 S! w# W6 |5 _/ S
* k4 u5 N- p+ h! n$ D! C6 R    B同步到此交易,检查交易是否有效、格式是否正确。
4 D, r4 t4 d/ e& o8 s, |" f6 m: l. a$ B) w; t" H- r5 m6 `/ h$ T
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
" ]3 X6 x# N. d2 R! B! d, G. w8 X4 t
& C8 [$ S  F2 ]    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。& ?4 o  w: k: X; U6 k
/ \6 ~  e& I5 N
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
1 J8 H! w7 v6 a$ O, O
0 r7 O' }' c+ U    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
( P2 Y  k1 k4 Z/ w) q# a& }8 T/ l+ I, c9 J3 U
    ####第五站:合约升级. M9 y1 s7 i: M. {& Y

, o+ \/ i2 `5 j5 `    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)3 r- M0 L. \4 t0 n2 q& j
5 s/ I3 X( D4 t$ A& p
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。6 H& k4 n+ }. I/ c

) n; e7 Q1 P3 ]& _- c, Z    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
9 X3 ?# r! A0 E
, `3 z: F  u+ ]    ####第六站:合约销毁
, ^  u! ?. f  W0 V: d
' {5 V- D* h8 l6 E* Y# M$ h    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:, g8 P; t; k1 L/ T' D  v1 G

; x4 h  m! z7 h! V1 B  T* Z! y3 w    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

& [* q, S$ T" Q    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
2 p; i- R  i4 K1 P; Y) e9 Y; F% O3 N" _" e
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1