Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
50 0 0
####第一站:合约存储! `* f1 @* s, X9 C) Z

# i2 L- _4 @7 M$ D    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:5 t5 j/ @7 H- }9 M3 \- c0 Q' }  Z  W

9 k* r7 ]0 U- r: @    -以太坊上两种账户类型:a)个人账户b)合约账户-
% W* j6 v1 c! n& M0 s9 E
, W9 E1 w' S. f. r6 w) O5 x( S( [    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。; n  M- V! u, L- i7 M9 |0 b/ G" \" X
7 v) f/ F$ [( ]
    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。7 v9 S- F3 y  b8 C( j5 U& y. k
! w' z% w& d& a, w# z: i
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
0 `4 Y2 @2 N: q$ h: Q; ?. ]5 K4 _' Y$ ?8 W: c: s; `9 Y2 J
    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
8 P& M5 U. f( `) A' V9 k
) l8 @8 X( J) ~/ E) Y    ####第二站:合约创建$ B0 q0 V4 y- H6 n* E. H3 B4 k
: X3 Y- F& a) C, M/ N5 N
    这里我们用用户A的例子做说明。7 W( J5 R6 V/ N2 ^1 D% Y

: \* g& O  z9 T& y4 R0 H3 u    用户A使用solidity等语言创建一份合约代码
% x% C" @, c% U) H  G+ c% l( T0 `
8 S2 J7 L4 m3 k: }( i3 |    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
7 M  P) h8 q1 n4 y- ?( o( _( ^# p
2 p4 N0 E# }; W) b: b5 M; O0 j: S' E: [! \. R    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。3 A- w5 O; w# v) G

) z4 J" m* Z# z2 |7 K    该tx广播到网络上,B节点收到该tx。
, E- S& C1 H  F0 g- D
1 K3 a9 t9 T! D6 L0 |$ o* _( R    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。3 |* R, O2 o4 a; s

8 C  `1 a! f3 P2 U0 B    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。/ i- {& }! l( p/ s
% o! G, _" t  |, |8 T
    ####第三站:合约部署: V9 M4 z$ Q2 @% @
4 _7 J' w& O& V5 }( Z) W
    我们加入矿工B和C。
( H/ C( L9 [! E5 }% f' }& M
6 f9 d# s3 Q3 K( |0 h" N0 O& d1 K9 \    -部署与挖矿过程-
- [# H" y1 g. v4 B0 L) n
  m% c% a" N& W    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。$ r( H" X% J2 n) k, O0 J0 A7 ~  u0 }

2 a! I4 b9 c* b2 v    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A1 A, S. C8 ^0 Y7 X

# y) ^) V/ Y# n" N3 Q    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
/ G$ S. i2 v) P- V$ B
7 ~! B- _5 b7 _& A( l    C接收到该区块,验证区块,如果区块通过验证:! I9 w3 F+ `% U! [& l# x
$ w! J: C. m# U' B3 a# [' ~
    a.C从内存池中删除A创建的智能合约交易请求0 p5 ]6 n5 a9 o- D# C6 Q+ G( Y! g

' n# W- m' m. N2 {7 T! ?  [    b.C将区块链接到本地最长链上(同步区块)0 ?; [# d' H* ^( a0 M5 K

! L( t) _4 O% J" i5 b    c.C将A的智能合约部署在本地区块链中。
, b' k- F/ W. \9 Y$ E: e
2 X4 w- J! D9 N    -区块验证过程-
+ e$ r5 ~% g  l! k! z% r. ~" D. K9 V! }' s) |& b8 b8 a- D2 ?$ d- }5 ?
    ####第四站:合约执行
1 I" n7 G# X$ O3 g7 r! H  v' [, {* Q
0 g- y8 q: q4 F3 D, o8 a; `& o9 G    -合约执行过程-, `7 o6 y* y: y2 c$ X" S* x
1 J" C* y! s- V6 z8 ~
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。' b! ?) a  W. W! ?1 s" W

% |: m! O- i% W/ u2 ]9 E    B同步到此交易,检查交易是否有效、格式是否正确。9 U5 f6 A5 k4 Q) I$ g

6 g8 T; j, l) H    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.
8 F; E: W9 p7 ?2 @9 s3 m+ C- ~$ i# \' V8 O  D
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。" h5 r$ V4 r0 M9 {8 B

3 T2 y- M  [' w" s    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。% o7 O* ^% x2 m: b0 b$ e

, Z& I* x' c2 g7 x    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
, r4 ?# Z8 Y) C% U# p) h5 p4 c, G+ M# L
    ####第五站:合约升级
3 r( U" L7 m, P6 O% O+ c# o
. y( X2 Q: K4 M: z/ u, {7 Q    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)  a! m5 z6 `% f$ ?+ e  z

$ e' N4 x  j! y' P( H    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。' J4 ?) V% F/ B6 Y0 o
. F( A& Y8 q7 o) [" n
    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。( T+ Y6 Z9 c  ]! ~4 K: r, G
: ^' I: z( V. ^$ f" M
    ####第六站:合约销毁
! w/ Z) M7 v* O
. x+ u2 ]" W8 @/ p; B" I    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:
, s; a  W' }. w" {: [: l* p
4 S: z) u* \, t" n* [+ h    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin

0 t1 J( x+ S9 K6 [9 s/ W0 S    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。+ n5 V' u) K& p# M: T0 K' \
* q+ t! ?4 G8 H, h) M, \3 k
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1