Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
340 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-
2 `0 W1 B6 i4 ]' m2 O
( N$ r4 i- `/ H' T! K, z- q4 y首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
+ k: e* t2 ?6 W, M: f3 v) [0 x
& N% |0 `9 S, S3 U" c# N) U其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
* g* H+ N" m0 Z' E# s6 ^" o1 C
9 y) Y) R  N" Q7 U再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。
  F& _. W  j; R; F6 Z2 j  P. f$ P( k0 |. [( Q" w5 G3 r& {
最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。
% j1 O0 B& [% W# K2 i& Q/ U; z
. L8 C: |* M5 v合约创建
/ B/ t6 y( P$ x, r0 k& d3 ]" P& Y+ L- g! K
这里我们用用户 A 的例子做说明。! X: x  Y: @* ?4 r6 N# }

, O( i$ Y, L, p; R0 {: W# @用户 A 使用 solidity 等语言创建一份合约代码
; a6 L* U, l- f1 [, D  v( `4 u  E" r
A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)
' ?$ }* u# X3 E; M. A. t- S1 _, @0 a
客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。
8 p& ?8 I* l+ W+ A) Z+ V
: x9 ~- s# q0 m0 \$ x, E该 tx 广播到网络上,B 节点收到该 tx。8 R- [! W! r8 b4 H. E- }. d9 ]
9 R. ^. i, A8 b% S5 L9 n
B 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
: k( [1 J% x! W! N& ]  d$ I+ j' ^, O: d$ f3 I7 {3 H: t/ O
对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。) U) Y) m4 u9 c' O8 C# n

, G4 x3 j* ]# v5 {" ~! p2 L合约部署
! @" [9 Z7 l1 y! ]% k# o% `0 d3 M4 i* H$ ?
我们加入矿工B和C。2 w" ^$ }/ u9 @3 l' x# _
. S' o& O, @! o0 w# F0 V9 o7 v
-部署与挖矿过程-
6 A! N" ?/ }! g; J5 Q) K3 a) o; L. O. H$ U% C( T/ ]$ v
B 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。
6 p* Q% K, W! l2 ]! x
- R" T, [5 j6 d4 p: E假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A
! @: c# `; ?" U* k" _
3 G$ ]+ r) ]4 v& B+ Z! pB 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。
- R3 i% C* @! i% r
, U  ?9 p* M: t' B" t0 ]# VC 接收到该区块,验证区块,如果区块通过验证:
9 j2 w; F$ _6 B2 `
0 R; t4 ?1 c( @  f: va. C 从内存池中删除 A 创建的智能合约交易请求
  s8 ]+ j3 M+ B- G
! K+ Y8 y$ G5 G' O# r+ ]b. C 将区块链接到本地最长链上(同步区块)
5 G8 b* `; }5 ^7 F7 u# J/ x) E/ v6 i- Q& p7 j4 c
c. C 将 A 的智能合约部署在本地区块链中。
* D: Y5 h' r% r5 z) L, z6 E
- F; d4 L' M* g& B-区块验证过程-
+ i$ V6 ^  q( \2 M) l! p  u, S6 {. f/ s: G8 M2 p
合约执行
' z2 v( ]7 Q/ p5 w" N0 U5 H3 W, b, y: `1 ~. _' ^
-合约执行过程-# ^# M7 u7 b: i8 X) v# Z
/ I" j' F% T) u" Q9 U4 k& w1 ^7 P
用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。
" o) s+ a# b2 X$ R' p
/ U, a, \) t# Q) }6 @8 N! w) r4 rB 同步到此交易,检查交易是否有效、格式是否正确。
, M0 z' i' |( q5 z6 {3 O* l. J# Q6 G& X0 @9 }' y; J( t1 p; s- t0 {; g
符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程.7 a1 [, W0 v1 v& `  p+ c

7 S# q6 L6 S% |/ vB 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。+ \! J9 f# |& k0 a

) L6 _! ~" M% dC 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。2 X; O, R: q) Q) r

9 e  S3 e* |, a0 ?+ V, c7 {网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码3 ~7 C( h1 S4 _! y. D8 Y" g
& a( e" |9 p- A7 d
合约升级
: B+ s' E  J( h; }/ X; W) u9 l) Z# p% `
部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)0 C9 W$ _2 {8 X+ l( i% `. O7 Q

$ F/ O' A2 _# u% i. ~# @' z智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。/ _4 a0 G- |1 T& E. @* g  }

! h, D2 @8 z9 i) S! Uhacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。+ C, l) s: P% i' O2 |% E8 k' }

) J1 \; h( m: V+ m( r合约销毁
0 Z8 e4 b- I% Q7 q  k. l; `7 F8 _! r2 Y; P
合约发起者可以调用 selfdestruct() 方法即可销毁合约。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2