Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
113 0 0
####第一站:合约存储
6 |  ]4 u! ~- M& V+ |: l/ J2 A: E% R3 x3 J! y+ i. h0 i
    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
) v, p' j/ N, U( P7 g* p
, I1 u& G( P; }- o# A    -以太坊上两种账户类型:a)个人账户b)合约账户-
' p( w( B; H6 p, ?: w7 k0 s$ x: b+ z  {0 F
    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
' i8 }9 C9 a( T9 y- G5 e
% l4 c( |2 g( ?- @    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
5 Z9 d2 [/ L2 ~, q$ t& U1 p6 J$ B+ H; H( X
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。4 Z( q/ r) E- A! e3 R( i

( |, ]5 |0 g* g) E& l) |    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
9 s, ~0 o6 ~0 `3 v' p/ H5 }
( `5 d9 S% A4 t) A1 y    ####第二站:合约创建
8 R- B3 N* Q) p9 Z" I9 t4 J& k6 t2 o( ]; s7 \0 f) m! ]
    这里我们用用户A的例子做说明。- z( K( l; N6 L/ C3 Y- F

5 E8 x4 ~; C' U3 H! g% Q% F7 T    用户A使用solidity等语言创建一份合约代码
' h9 P3 R; c% w) H  `) H! O0 _# f) j0 _3 ?: h2 L
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
4 ?/ `7 z! N8 v; i. p3 c
. D( ]1 v' q: w% N9 {( z7 g    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
9 Z: R+ T- G# h* W, i0 ~. ^) [0 J
5 a) _; b5 ?* d( }- l' R    该tx广播到网络上,B节点收到该tx。
6 `# K. c+ ~6 J1 H. h# M
# \, q# y" S: P( H6 u0 U    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。* a( ~6 Q( I9 W8 Y; _

1 S& B  g0 ]& }8 L% _/ d    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。: K: H) T9 E! o
' V+ e- B. }) Z% R4 X
    ####第三站:合约部署) V9 G8 A5 b- a$ V. D, G" ^

) p9 N6 a  P# J5 C$ O2 r; t    我们加入矿工B和C。- e9 s. |( b) q5 I) @0 p' v5 i2 h6 s
2 p4 G* e! v' |. S7 Y0 X
    -部署与挖矿过程-
+ P! I0 W  i2 e  E+ q' b4 w& }' z+ r2 p, t1 l5 a& R' g
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。, Y- t# h) R/ W8 S. l% f5 \
, ~+ u; y+ P0 Y9 t
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A( O' N! R  D  q% i+ \. r6 h

2 w5 y2 m6 l: p$ E* i0 A: t    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
: }) l* F( k3 J& n* o1 y( ?, P  E+ A2 y- s
    C接收到该区块,验证区块,如果区块通过验证:& Q$ K4 X1 `+ p! Y
% x4 f0 e! ]* G, k2 R& `
    a.C从内存池中删除A创建的智能合约交易请求
$ m9 ~. o. `, B5 l% ~  I6 l, w3 |. w* y
    b.C将区块链接到本地最长链上(同步区块)
$ _" X0 C6 }1 a- `4 D6 R- X! f' |5 x, F
    c.C将A的智能合约部署在本地区块链中。
5 j+ ]& L6 Y, d/ W( R
* r7 _* @5 [- q, Y) E6 v; I( j    -区块验证过程-  t0 x8 w& ~7 p& L& {9 \

- g* \9 Z- p7 h* [1 |  Z+ e    ####第四站:合约执行
: u( M7 _3 A* q' s3 C/ E* ?# M+ n% {6 r0 v. m
    -合约执行过程-
: }7 a; F( f4 t% b  x8 \
4 `4 l- }, V3 h+ B0 `& X8 b    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。
% R8 H# g9 [) N6 n' f& g5 j1 P; }) @, Y# @. }2 Y8 S3 u" ~
    B同步到此交易,检查交易是否有效、格式是否正确。
9 y/ V! M6 `" Q/ C3 P6 N* e9 K( {4 G. ?
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.) o. `, `/ E* |2 [" }3 C

$ O+ A& [- W3 p5 k2 S% ^    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。
0 J- Q6 E' M( ~# ?( c& u. [" x3 b% K
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
7 z% |7 Z) D  ?3 b7 w+ T/ x8 k5 L; I1 `
6 u; ^+ \' N% o" {: H/ }) I: |    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
* n) C+ x; Z8 u$ _
& i4 l9 F" K6 H3 J+ A/ l; s    ####第五站:合约升级( N$ o+ D& T) @4 U  E& R" m
8 M) a0 v9 j3 x7 h: ]
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
) e: j  \  G' `+ L, h, g% Z
; v  O4 |4 D- w4 G6 E+ Y, q    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。
3 O' @" l% A0 I. ^3 A
4 k& o+ p9 o. G, ~4 s0 B    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。  r5 ~/ x, D) y0 G
1 A( x. t. y: B/ n8 {8 M$ ^$ X
    ####第六站:合约销毁
2 v; Z7 J* i6 P. }( D
+ d% c. |$ Q5 B# Q% G6 _" M    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
- `3 N6 ]0 ?. M; ^/ f; N* C0 v# `- Z* j- t2 }8 L& y
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
. e/ {1 X9 F$ d. p8 U* {
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
, r' i' {4 s, x, l1 w. r( j& I
) ?" C+ m$ g# G, V/ W    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1