Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
315 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-
: f9 G( D9 T& |; p4 _, d8 C3 Q) G! \# j. d5 P% u
首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。& j: n* q0 Y" d7 v& H$ I

+ @+ {; F0 K2 V% }: G; b" n+ |其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
# ^  S- I2 n! d/ \+ r6 E
) c) z5 w' S* C) f再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。5 [1 u9 R8 Z6 y: G3 M1 o: `
2 l% H$ m! ~$ J/ K( @8 x7 ]
最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。
/ G% [4 i! \+ w  [3 K$ O4 g& Q8 k
4 d8 y& h# b" o+ Q) M( z合约创建
1 R) h3 F( h* f4 S: C) y
2 U4 D) [# I! @2 W0 ^这里我们用用户 A 的例子做说明。7 U. v0 r2 e! \: |5 _4 i' [  t: F% B

$ S$ D- d2 \& {1 T3 ^用户 A 使用 solidity 等语言创建一份合约代码
/ G" J7 W; e8 i/ Q* `; I% b  u" ]2 z
! ^. A1 w. P0 Z  n5 V" ?+ z0 S, o3 ~A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)0 H2 p6 q# K: _! m  G( L
6 A& C* D* N+ g( D& e. H( F8 O( y
客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。: q; M. m8 n- J) P0 K" i! B$ I- o

) ~8 i9 u6 i1 b5 v) X: D该 tx 广播到网络上,B 节点收到该 tx。% z. j3 N; F6 z- e) O

! r  a' z4 s; V- e* E) wB 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。  r7 a8 H  N+ L  {3 \
6 g. \/ S! f4 l
对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。; n/ b2 y2 n' U$ U. \7 n* c

0 k% l* [3 r' ]7 U+ T8 ^* S4 n1 C合约部署' k1 f2 p/ X4 ~7 b

7 H; Q' A0 e. n5 D+ X2 l我们加入矿工B和C。6 Z. A9 \2 t$ {4 h7 H3 w
) g: s7 K( t" f  v  x4 g; _9 ~$ b
-部署与挖矿过程-
8 p8 v# g4 e- ?+ L, P6 G0 T9 a1 n
# K% B; \/ s) T% WB 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。. E% u5 W/ F1 M- \# `0 f& z& ~. A

' ]6 G/ _5 {, e7 Y; R) d! r假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A* w# i5 Q% I# }

% d* Z# Z* F" v0 ?2 x: o2 S8 EB 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。
; W6 S$ y) P: `7 f' h* ]( A. G0 l: D8 m+ I4 t5 s
C 接收到该区块,验证区块,如果区块通过验证:
0 c5 X2 @. E: l2 t: b
1 d5 o6 o- y( [/ A' U; [4 Na. C 从内存池中删除 A 创建的智能合约交易请求
  m0 P7 z; f6 A0 Y$ a7 |
; T1 V, u2 S! w1 Z* l* W: A) ]b. C 将区块链接到本地最长链上(同步区块)
6 V1 T) Z0 g" J2 J
/ Q( F; H. J0 @1 Q) v6 Fc. C 将 A 的智能合约部署在本地区块链中。
: E1 \9 T& J9 L1 B  I' X! H
' u# i6 |3 T5 y) s9 u, c0 q-区块验证过程-  i0 Q* e* i. O6 n2 s! X
" l8 d# B3 y6 m0 U; `! V/ X
合约执行3 a  b" X7 \; J9 [0 d
3 W3 s, D0 @. m1 r
-合约执行过程-
! b) Z3 g8 i6 I& Q; Z+ Y9 a# u* I8 R
用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。: t$ u, p# u0 H' t
5 l% C3 R) y9 R2 L) a6 m
B 同步到此交易,检查交易是否有效、格式是否正确。1 ?! q; B2 }' T. Z3 n

2 Q& g. H$ l" P; u8 p! [符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程.' a4 X; n: @5 s& N* U$ r  I
: L. ]4 T* h- g. t
B 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。2 a7 H6 F+ |* h9 r' x

1 ~* e! z  k( y3 U; |1 b/ AC 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。
+ z( N! n7 S# X8 G5 T: M6 e! K
+ V8 ]9 |2 j# s+ V4 M( f网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码( r5 O" \, i* J. U+ f2 A. l6 H
9 F2 s) G! e$ _  w8 z5 r1 s
合约升级
" I$ t* G' a+ b
8 B' r5 y( r, X: ^, g+ K部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
4 O. n) t1 C1 C7 @2 G8 E7 Q2 y- |6 ~' C2 ~6 r4 E9 w
智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。/ o" i/ T  ]2 t, l& G" R* l3 D
; i8 U5 Q: x4 k  p" p
hacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。3 O8 {2 a/ ^: C8 M0 Z5 L* B

0 ^( V, G+ X5 w" g: B合约销毁' }' ^6 c* Y- d+ K# V: A- q; V
" X! O( \* W) s( U
合约发起者可以调用 selfdestruct() 方法即可销毁合约。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2