Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
341 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-
! ^7 k3 ?. H$ @" ^9 i& B
4 D+ i# R0 G  I# G* _; O首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
+ A9 G& |# r- D7 a: q8 K$ s! \* i
" _9 k5 Z; ?! a; D0 D其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
, v0 v6 O* r8 o. \- D- Q) I: U
& Y3 U* [6 Z* {  ~8 X: E再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。3 p9 G0 O# U5 B- x- s4 s
4 ]8 C0 U9 B7 b* G) d) [( o3 q: c
最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。# O6 F/ U( Q8 l

1 g+ p$ Y6 p' q' I合约创建8 S# R' ~0 z9 S4 Z6 [" u+ Z0 f* u

+ {  T5 d5 b: x+ j& O这里我们用用户 A 的例子做说明。
, S. l9 F; O3 K9 S6 N6 B- F
4 z7 s/ i' p6 x用户 A 使用 solidity 等语言创建一份合约代码" g6 w% @- {* X9 R. w6 H4 {
& l8 w, v8 g' B0 V! G
A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)1 V& V7 o9 j, b

& j% @9 z- G9 }客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。; ]4 M5 }6 T/ f, ]; m
/ ^& ]9 D% E) }5 S+ u, l- a
该 tx 广播到网络上,B 节点收到该 tx。( O% O. u, ^- K+ t
2 c$ b4 X3 f& H1 p1 J4 F
B 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。* R, O% Y7 {( S% q2 {% X4 G
6 u* Z) s+ ]8 v
对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。' r- t" K5 \" j7 n1 C# H7 p

6 [% i4 {3 V2 K5 q1 L0 m合约部署
- E. h; D, I- A6 D2 _4 B5 B% ?
) i% e( p0 k' ^4 Y9 ~2 u% A( [. E! V我们加入矿工B和C。
' D3 J; }, y  x8 Z( r3 ~2 ^4 s) \/ o: L7 M+ H: e# s
-部署与挖矿过程-
9 F- m7 f% w3 A) ]+ _4 ~1 T, l2 J* Q) g8 F1 C5 n8 |
B 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。. i/ ]2 y6 u# T. {3 o* m) R( h
% Z, ^; `' @7 ?/ L/ m( ?, H
假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A
7 y( `- `1 g, S% I+ W- Y2 e0 g+ j
; R# p/ R  g% D8 c8 B, z8 WB 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。
* a# B2 {  W, P: c4 V" @, T7 A" H* w! f1 O! @
C 接收到该区块,验证区块,如果区块通过验证:0 Z. G- q; y/ A/ m4 ^, |1 y6 [

7 _8 w& m! C( w5 M3 Oa. C 从内存池中删除 A 创建的智能合约交易请求7 Z4 P9 A& r1 E& G+ p7 `2 c

+ q# h2 j' G/ D5 a' `b. C 将区块链接到本地最长链上(同步区块)# n, Y, G3 \$ [

) T) a, z7 K- l2 W: f& Y6 bc. C 将 A 的智能合约部署在本地区块链中。
' p1 W& H( W1 D$ K3 u1 P
  s) a2 `6 M1 \' b-区块验证过程-
) o) W! `3 g: y4 {' U& [( U0 y. u+ \# _
/ \" q! m9 W/ n合约执行$ F! K" m( V( _7 i
' k9 I: m4 v: H2 I, N
-合约执行过程-
3 c+ |+ k% y: @4 G- q: ^
7 ^+ e" i4 I7 _. l6 e2 o* O# p$ ?用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。& [6 O( c7 I% A
& j; J, q5 ^* v+ ~0 O  c+ O0 R
B 同步到此交易,检查交易是否有效、格式是否正确。
7 k2 H% O& [/ R9 q7 P7 Y
* I" j# K5 E8 ~符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程.
# r- n' |) A+ m2 a
0 W+ p% [4 [+ }, d( K4 k  R) eB 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。
! t  n/ g6 f5 N  |4 d& G8 B+ Y* S" s4 o8 B
C 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。
8 {* d0 j! p- j# q: C$ h! q& R: G
  J! Q0 T* y* |, A' X! i% P  ~; Y网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码; Q: h# f* ?$ h. B4 r

7 M6 S9 f" X/ p* c) k合约升级
  F6 _! b9 d3 A2 M% j6 J6 _" q4 l$ h
部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
1 Y/ Y! v4 Z. n' z
) C9 @' p" C7 A! ~. w7 }6 [: t智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。
( |  ~& ~  l" M
/ _. x  |/ D+ ~1 l5 W) d, d0 a0 ehacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
9 @( B* [5 P: D+ Y! j1 o" G; ^( s5 _4 m2 k" G. y& m  g4 X
合约销毁
( R. Q4 M3 O. o1 [- n2 l8 K7 G! W1 M
合约发起者可以调用 selfdestruct() 方法即可销毁合约。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2