Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
78 0 0
####第一站:合约存储
* G6 ^. W* g0 i) ]; w% `2 f& F! N* s, F! G& K+ f& v" a
    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
- p, A: _. T" A5 B0 \( w8 O( @" G- Z4 g! g
    -以太坊上两种账户类型:a)个人账户b)合约账户-
) ~0 o: Y7 q$ o: h" ?5 Y0 B
1 G' p  G3 t4 R1 U, k- u    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。# X4 z1 C) u) I) v; ]5 i, c  y( ?
9 ?) }  b0 O- b! d, N; e* E
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
" ~8 y, z) u: q  `# q
  o/ @9 I4 u! B/ q# o" C  V# C    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
0 ~- G' n  q( R- `" M) z  ~
) c- `: A# d# x7 ?7 u    最后,所有的基础存储目前都基于leveldb,一种kv数据库。& t; N2 [7 S3 b

  Q& [1 |+ |( D, @$ M9 u8 J    ####第二站:合约创建
6 S) k6 O( o9 ?1 g( ^7 j# h. L9 }# e0 N4 [
    这里我们用用户A的例子做说明。
) d; v5 E% e# `: O% A
  m, l3 I- {" W$ U" \# S+ G    用户A使用solidity等语言创建一份合约代码" \- P4 H$ f% B) v$ n
6 p/ L  t; z  Z, p" |
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
, C" C/ o. c) T2 n& P+ e! P$ z6 Z% N$ Y
    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。* q' H* h7 @9 c* d
" n& Y; _) V3 o5 e" P; J5 Q8 E
    该tx广播到网络上,B节点收到该tx。9 [' [& }0 X$ G; i
/ Y8 B* Q( u5 }
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
' ?  X# h2 i" Y  z1 k
0 \( ], `8 U9 d( p; [    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。
/ H( N) b$ Q4 k' w& z3 }0 x8 S, T
. o. T5 D  L: x& k    ####第三站:合约部署
1 M2 B6 ^9 K' F1 i- U9 D& u0 B# m, ~, K* `& l2 _' q3 j& |
    我们加入矿工B和C。- E+ C. Q( L5 H* H3 K- `

! F+ D/ R$ K6 m( r8 F) f+ Y% R' c    -部署与挖矿过程-
  l; b# ]' X6 r. S: j; E0 v. m6 O. D* O
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。
( A5 S) n; R* ~) F$ t$ K! s  H9 D" q! M/ F
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A- x3 D/ l% l1 h* s

- U0 p& V+ B+ H0 P5 F0 K9 z+ {    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
* r/ |: J  o' b! g, u" O" f* Y6 |0 Z9 p. N7 C
    C接收到该区块,验证区块,如果区块通过验证:
1 M8 J9 e5 g% N  J- e- J
5 a: @7 W# G3 E/ N1 b. d3 A    a.C从内存池中删除A创建的智能合约交易请求
  |& V# t  F0 Y8 W. O
! Z" D5 P) g* E4 P! b4 r% m    b.C将区块链接到本地最长链上(同步区块)( r' ^& ?$ J. _# J* E$ ~

2 q' B6 n* a: v% s    c.C将A的智能合约部署在本地区块链中。
1 C$ m! f, l  x9 E" H& J9 A8 }. T  [5 C* c4 e: T
    -区块验证过程-
$ A. ~6 [1 U2 ^0 d+ S0 [7 u$ n' k$ U) V( g
    ####第四站:合约执行
8 L$ G4 @/ v- r- ~' c. b+ c1 T! l- M% o
    -合约执行过程-9 l5 Z. ~$ @' Q+ M
. r- V: _5 |  l9 U+ [+ D
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
! a7 N4 T% m6 ~! C2 |
  x# T6 H! K: o! r4 t/ J    B同步到此交易,检查交易是否有效、格式是否正确。! w1 i  v& Y- S& y

* Q, P; S  ]: A) J    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
' h% P9 W! ]( ^: Y0 [& o6 m7 i  g; a( ?
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。
; ~' x+ e- |6 P' f' @" p& G: J" k' `! N8 M6 y& y5 V& b
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。7 `9 {% \6 m; J6 ?: Q

; O7 q  L3 [  r7 ^5 w7 H    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。5 {5 O# c( |& [2 n) Z6 t

& z7 |' [# x5 h    ####第五站:合约升级
1 d* O4 Z& I3 B( t/ i  M5 R* `/ F1 y  m5 t
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)  O2 v8 ]6 x& f! f' x
5 X! _3 |( ^' u; a( ~$ o, i/ t, _+ ^
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。) @; |4 L/ T! Q( f/ n7 q
7 d, C$ g# q; s: M1 n( D
    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
3 s$ |0 B8 K# E4 h( U' H
/ T% J2 J. m& B# S    ####第六站:合约销毁
8 x% N6 h* G2 `" k! k, H! ~
8 w8 u. Z' b# i3 |9 F) W    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:9 o, _. e/ C2 x5 z

) C9 u  @) J0 L! [6 e    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
! o: B! z# K; |1 ^- D& o
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
- x; T  T" O3 v9 c/ P( i- B9 Z8 p, s2 r3 O$ l  B
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1