Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
116 0 0
####第一站:合约存储% J+ s( T5 [$ y3 \

0 `8 h; m/ B9 \    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
3 u8 r4 `, g9 x6 B8 m  E
0 Z- d1 H2 h7 g% o    -以太坊上两种账户类型:a)个人账户b)合约账户-5 v& q3 M/ M6 r
2 \; b2 _6 W2 o" i
    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。, J% n9 ~/ a! {/ b1 r+ g8 L

% B8 K) P; ^# Z; {. N    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。7 P' b7 Y  k$ V- T5 k3 p4 \+ h

8 `( \; n/ s% r  Y& j* {) i/ X0 t5 x    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。% @8 Q, z! y8 f( `1 H& |
" G  `& y9 i% I5 Q
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。* B8 G# E9 G4 P) n- J- z
4 f' Q0 y3 q7 R4 F
    ####第二站:合约创建
# W+ F/ y, F, d# L. ?0 z2 E6 G" q
5 s6 j. A; Y  Q( [, M9 Z) S! ?& `    这里我们用用户A的例子做说明。
! I5 [4 x& O; `; R- j. A( d$ ^( [" I& `( y' |/ _6 e
    用户A使用solidity等语言创建一份合约代码/ B; \3 l4 k, U- _

$ X0 a# {2 `, S9 n; Q    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)& M+ e, U* D& w5 ~3 R, D

% O9 j+ E! g& R. [9 u    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
4 `, Q6 t; O4 c' d0 ?' p
' L8 _0 ^4 X& N. v    该tx广播到网络上,B节点收到该tx。/ H( b  |& [: _6 G) [

. S0 _3 j( E# m" k) a- |    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
5 x# Q- M* O' Y' ^4 y4 g: F
/ e, s. |3 Z0 u    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。) |$ s- ]: `. `) S! b, I$ I
$ O5 r4 G/ X# S/ e) l  v- D
    ####第三站:合约部署" {; S3 D1 H5 h% C6 l
( o8 G% f! p; }/ I  ?2 i
    我们加入矿工B和C。. W' ~0 R4 s" {* ]; q
8 l# w8 v2 X0 C% F2 V& ^$ [& S
    -部署与挖矿过程-
1 l- n1 s8 l' P* z" ~; l9 p! L2 l
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。' [# c% i% N( f0 Q

" [4 y# P0 b3 z$ ^9 n    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A
4 f! n2 t4 f* g, E( g5 ^7 m7 x
  L7 J& Q; Y. J$ ~3 A. K    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。% O3 H: K  U6 f# G2 G8 Z$ r4 {) Y" Y# o

) q( u% N: _1 p) Y1 e0 s+ c2 `- b    C接收到该区块,验证区块,如果区块通过验证:# m3 ]/ {( y1 ?9 i* r
9 y& P5 u1 R0 @; z' x
    a.C从内存池中删除A创建的智能合约交易请求
5 K) G; i! L* N( i$ h! X
9 j& o& g2 b6 t+ I2 C    b.C将区块链接到本地最长链上(同步区块). m6 W+ v" }( I# @- B
/ A5 t( `  O: H- w. |! n% f
    c.C将A的智能合约部署在本地区块链中。8 K6 _5 j  T+ w0 x

/ r) C! m9 L! t# H/ U, F" c' R    -区块验证过程-
( w: ~# E& Y9 J% P2 z4 O
9 K' T; J0 g4 `/ j. @    ####第四站:合约执行5 h: H- n* h0 [' e1 K
/ k5 R# |8 H# D9 v, H, |% a
    -合约执行过程-- J2 r4 k& n6 e; `
1 }/ A- T# g; M) w8 v9 e4 v, \# H3 _* s
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
( e1 Q" L- C9 v+ F* n/ y6 h
) q. H& Z6 o- t  _' E    B同步到此交易,检查交易是否有效、格式是否正确。9 m7 e$ k, [1 p9 A9 B% l( f
5 ?7 C4 v0 R6 p
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
" v. {/ F1 K; ?. P( ?* I5 r% l9 P' _# Q1 }! F. k# X
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。
: X! c' ~/ W& |" m  s' ]/ W; o+ }0 s. u/ c2 B) o: H* x+ J0 }
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。+ y5 i" J0 M, e0 N

( _" b+ n% o* w5 |4 Z) V5 _    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
1 m1 y- K9 E4 @& t, q) t9 h2 z3 j! {& N# Y; e) Y: H6 O& ?0 p( s
    ####第五站:合约升级0 m+ m7 @, m1 W6 T2 S
: e# \1 S& N! _5 Y7 U( q
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)# e' x0 P( x5 C. z- H* u6 A3 f9 T( U2 w

5 M) N: T( i% Y% {7 M    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。! @7 i0 G. c' @" c. _

; M) W) m# S6 y- l; t- n$ ?5 |    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。9 u0 Z3 p7 ^  w  F* v

" m% ?) w$ B7 t7 \/ d: z, S% m    ####第六站:合约销毁+ S# Q6 ]5 w' v# v

- y; }, m9 m/ e7 w    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
) m3 Z* q: Y/ Z, F3 {; j
) {2 p- U4 ]0 S4 v, ?    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
' T5 y3 ~1 g3 \1 a
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。2 t( ~% J$ {6 x  R4 y- d: q
6 c) @: p: G. S- Z
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1