Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
117 0 0
####第一站:合约存储2 ?  T' y# t; j3 K
$ D4 p( i. J# [  x) i
    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:$ b  o$ ?5 h: V7 y! C& h  O4 H% T

' E! J0 ~  Y. g    -以太坊上两种账户类型:a)个人账户b)合约账户-
5 `  p) n. U+ B8 {
+ R1 A/ E' I4 k$ ?* F% t' k    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
+ {4 n8 Y& G: T' d8 l3 G5 U+ ?' g+ M! J1 [$ T& z
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。+ X" I$ g( w4 g
! R6 S$ z! f) C8 W+ W
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。0 T0 Q) H4 [; Y# c
$ ^: u% \- g$ ~: |% j0 T
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
$ k) q  m' W* N4 j4 W: m
8 z8 W( x# G$ G    ####第二站:合约创建' _( }8 a: x4 ^* Q4 o
# g# Z3 E# {& n! `
    这里我们用用户A的例子做说明。$ a5 H5 c2 F) y8 }
2 x% T/ Z5 F1 d9 ?4 R5 n, ]1 _
    用户A使用solidity等语言创建一份合约代码/ A5 ^) T5 i( @% i/ Y
+ D2 h7 S' w. ]4 ?
    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
3 G& K& {) M; h! z
  \+ n; ^! ]+ I    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
" u+ h0 I0 A5 \4 D
  n$ Q+ l' n; h3 w) J. _    该tx广播到网络上,B节点收到该tx。
; l3 G5 |* t- V) }( a+ H5 R/ V) l. ~7 i  l$ D. D0 d
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。/ M- J7 f3 N; L. p, U$ j

- s3 t% a4 J% Y! L- n4 T" C    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。
' @! N8 m' [& w$ G( L2 j3 p/ s' H' V7 Q: H' C# n0 J% b
    ####第三站:合约部署
3 X$ N5 g3 J! f% M$ B/ B2 R
3 |0 f. o8 F) A8 u4 O( u1 B    我们加入矿工B和C。
- h( N$ D& E2 P7 }' o9 H! _; g7 V2 h1 ]$ z- e, ?6 A4 B* x
    -部署与挖矿过程-' C( R0 r' H* E' N$ g9 \3 e1 k& y
" g# S) Q, G2 b$ G7 s' R
    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。
- J: k5 l* c" N& q
1 m) u0 s% K* B1 O5 M) e    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A4 M+ p/ E) S% w, L2 s2 i5 g8 T) C
6 D0 S3 J, l  z+ X. B7 b# {& g0 P
    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。/ C! E- P, m2 q6 P: G" Y
' O) ?' [, T4 X! z
    C接收到该区块,验证区块,如果区块通过验证:
0 L( W4 P  d' @0 k
# p# I0 _" N8 \8 c6 ~    a.C从内存池中删除A创建的智能合约交易请求
. L6 Y9 i/ p; ?% c9 h4 z( r7 h! _. T; z
    b.C将区块链接到本地最长链上(同步区块)
( e$ @: p5 A1 E( w9 w8 v4 L
' ]' R* }8 c, J3 Z    c.C将A的智能合约部署在本地区块链中。1 v# j3 ]. w( n4 D, b, I. A) F
1 z" t, n6 ?1 d- w
    -区块验证过程-4 R6 }6 f! Y" G

, I1 X8 x0 j& ~    ####第四站:合约执行
3 w9 i* ]3 c4 T$ d$ X3 @6 R6 F9 L
/ P" u1 C, Z6 i& O+ N# ~7 I    -合约执行过程-
# J( W  K7 }5 P1 }( G5 s+ C, M
# ?. W, |$ [$ S  M    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。1 o6 s8 ]: \1 W$ L
8 z4 Y3 y3 V1 e+ q) d; V. O! Z) ?1 ~
    B同步到此交易,检查交易是否有效、格式是否正确。: P4 a& w( v0 I# \% F4 ?
: i1 ~, U; m6 I, L$ B0 k# {
    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
( B& R$ C) P! A+ R
: e8 u1 u' J' v    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。2 R3 z1 g4 O5 I: Q
& {4 }# N4 ^7 t$ e; u: Y: c, E
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。; h: W# V# m( X
0 u/ y) I. w# r3 w0 F
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
8 |. B' y& L1 Y! l) h) t  O8 T' v# j1 P: c$ v& d- `2 r
    ####第五站:合约升级
# @6 J9 E  u; V. G: x  J2 M
, w9 Z. c$ M7 M7 \) F3 L) a    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
5 c5 |. l" n1 m7 ^) H* i  a! W9 x' J
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。
  I* V; R! m0 X; l2 G
7 f3 }# M$ X1 o% A4 I: P    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
# Y* x1 \& e/ m# o# v8 ]8 `1 [& {" ~5 O1 m/ ~
    ####第六站:合约销毁" D1 d2 s# c: F! G

* l  ^& I  \3 U    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
' A; V8 L" ?: r3 q( ^
, Y9 n% n% Y1 D9 L3 N7 }    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

& Q8 V% l$ q) Z/ \1 \% s7 t1 C    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。3 I& ~; D& P! m

, k9 e1 r4 q& R+ B3 ?1 ]! x    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1