Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
76 0 0
####第一站:合约存储9 U; C7 Y. m# y$ x

! E$ Z, x5 V4 z' Z4 K    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:& r7 I, }; ]: v7 Q3 u
8 a; f1 F8 W, ~
    -以太坊上两种账户类型:a)个人账户b)合约账户-" l, ]8 @% }$ |, l0 x* j; j' T
7 x- k& m& e$ V+ }
    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。) J5 w, Q# \- P: r) |
2 a# n! {3 [4 u& m# P: e+ F' C% n
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
7 v7 M4 M" L$ j+ {' k0 s$ Y8 e* A8 Q2 B4 r$ |0 B
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
( c4 b9 s. u5 {6 y$ D) P' E0 G( `' `# l" Q+ L" A/ l  T4 l
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。7 }" r& R- c3 Y; g" i8 i- J
6 v; a3 d) o, @1 K# T- M9 V
    ####第二站:合约创建( Z9 M3 X  J+ _& P; w# r

8 I. n% U; L  |5 V    这里我们用用户A的例子做说明。
2 J2 W) W$ Q2 e) c* a
; H7 K0 _: R; Y1 G" ]    用户A使用solidity等语言创建一份合约代码; Y& D6 b8 ?/ ^+ b3 c# A9 z9 e

. h* M: U6 L; H* K    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)0 V# ^- x$ D0 I3 [( A% y

. A6 U6 J" v- z0 l/ a    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。7 E3 j) K( _1 \8 g  [4 U
+ L# {! w; ^( N+ V1 X) o* |/ W8 b
    该tx广播到网络上,B节点收到该tx。
" c* W+ v! I5 X0 c7 b
$ i% c6 @: h0 Y2 ]0 n  b" }% G$ D- ]    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。4 E  k4 p2 D0 O" x7 f9 U) ~) _! L3 T$ \! t
# P; s3 Y/ U% x. \- w$ H( t5 O
    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。) T5 P$ h. ^' L7 b

. Z- \, _0 F- G9 |" Z/ H    ####第三站:合约部署
- L2 f5 J% u4 G1 j3 L4 w0 }, H9 D$ O0 e: @2 k; [9 g9 E. _
    我们加入矿工B和C。
' {/ X* d3 y% s2 T4 M
/ c! m! \" y, ?' C$ p4 ]    -部署与挖矿过程-3 j& _+ V/ v* d( S. S9 O& t, }, j

  ]/ C& ]! X3 r- L4 k, F$ k0 Z    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。
! q% B/ k9 [0 _0 Q) ]( Y" B2 _6 K' s2 ~% e" J# m- A. ?
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A
' ^) f; c# g$ V
1 _/ {0 t3 q, T  ]# U    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
# ~9 E% i7 O0 c, W& B+ Y. ^7 S# G4 N4 O% Z. c
    C接收到该区块,验证区块,如果区块通过验证:
% b. K/ G% j, Q7 z* H5 [+ n/ _
4 P. W; _0 d. T    a.C从内存池中删除A创建的智能合约交易请求9 `  m% S! c5 P' S" q: I
) Y2 {; k* i, h9 d
    b.C将区块链接到本地最长链上(同步区块)6 I9 v9 I  w& t: [

1 ~3 p" G( C3 K5 X6 [+ N; @    c.C将A的智能合约部署在本地区块链中。; i! ?. s. r; c  T

/ @* E# `# D' e  ~    -区块验证过程-( E0 r* v5 u% ?( d' ~0 ~
: k' Q' Y$ N; Y8 X
    ####第四站:合约执行
4 H$ O$ o4 B. p- W6 C) @) d
3 c6 H" X( L, b" m8 G% X& [' S' t    -合约执行过程-
; q, }( l1 f6 I8 R+ O9 Y1 e) m. `- o% K
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。4 k$ l# O9 t9 H. ~6 F* r" z6 D, j
$ n, F+ k& k  d( k" r' T, m
    B同步到此交易,检查交易是否有效、格式是否正确。
& f+ I4 D" Q* g( n2 j
- @# m6 e2 k2 `5 }2 \    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
/ L# H7 @/ l0 ?* V3 W' u. a0 v/ _6 K( q: O; J3 g
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。2 u# o9 T- j5 y& x
2 n  m% A1 ^; W$ P# x6 O
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
( S1 |$ |; J: f* t7 e7 r" t/ y/ S! B8 l
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。5 [3 N2 W) l" Q, P

4 B* R- b% }( T$ V5 E* G: w8 Y' c    ####第五站:合约升级
$ l( U2 a) ~& w! @$ F' D4 E" b6 r0 w
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)5 ~7 d+ f9 V% @1 o
4 c3 [! B( J: g3 U
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。
0 B# T" ]& g% U5 T8 F4 H
; E; q! g8 J) G% X    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。: r5 z# _7 W( a' j
) Z; @# S; [: V) @3 `/ H
    ####第六站:合约销毁; `% n$ N& R5 _' S

3 }: k9 g- B; v, L' \; X7 z    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
- P# p, j2 C6 x( Z: r. b" F5 Q' f1 k- o- ~# H! C  g! n
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

1 @0 I  Z# c% F7 ?# A' h    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。
& _/ ^* ~% }% \! I3 w" l+ Y; {
# l, r! K: a9 L; ^' M' j6 ~4 M- w1 o    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1