Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
295 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-% Y. J6 R) t2 }( d/ E

9 i% O' P" m) [8 r( o首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。$ V. e4 B! Q+ c
7 k# v6 ^0 ?" q) o4 j* V  o
其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。! @3 S1 U# ?( ]

  i+ I  ]( I# o3 N- K0 y7 O% s再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。# Z0 j" H+ }3 c$ h- H4 g: W

* j$ T- S0 ?: f/ n' Y2 b) B最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。1 N1 S! O2 D' i2 q' e; V! {5 t
8 G0 J' m7 M) a- h
合约创建2 c( B4 K7 f$ v

* s) f; j1 F2 P! u& W这里我们用用户 A 的例子做说明。4 Z0 \% s$ L4 B; {- l& B$ D4 J7 ~# T
& Q6 Q1 f6 ]1 r) I* t( o! s5 `$ I
用户 A 使用 solidity 等语言创建一份合约代码
& S8 x- E# c% e. x( T: F% p# s( [  W$ Q2 Z" E
A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)1 M. \$ \: t0 y* P# r, D
6 k9 ^9 K  u' k5 s5 y% c. \
客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。6 j4 [/ r) p& d" B* t5 W
* \0 s, z4 U* H" i4 m7 v
该 tx 广播到网络上,B 节点收到该 tx。0 _; G' r" a: s, m- \, f4 T
% s* G8 ?- Z8 a* O) Y0 C
B 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
& ~3 B9 A, {* U2 @) j  X& q) L
: t- r: r  k; b$ }3 L对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。
2 O0 y! x% _: @% F
2 {3 Q7 U# F) g. h2 R% q合约部署8 \8 `+ k+ c5 Z; s6 `& [' K
1 k( W& }% |7 n  P5 t
我们加入矿工B和C。$ o" g  d8 `3 J- [% r7 _. y

" e; V0 n: R# W. P4 X' d0 C7 a9 K-部署与挖矿过程-; Y# z( u2 ?3 J3 D  P! R: o1 D: y, }
4 B3 T$ h) K+ q8 s4 h" q
B 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。! e; r" u2 I$ V* r  j# p% I
5 a  X. w6 L* W, y/ N8 @4 x
假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A" V$ H. m6 K* f' ], _& K
$ m1 D/ W. `- f# {: t% l+ O" {
B 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。6 L5 G- s6 J" V. F( \" y
* c4 l& n7 i2 u; `3 j) F2 y, i) k
C 接收到该区块,验证区块,如果区块通过验证:( I% K- z4 V; z/ }

3 ]7 L! c, ~+ za. C 从内存池中删除 A 创建的智能合约交易请求
; v3 m' d2 W6 j+ _% t( _4 v* ~  e2 J! L2 p
b. C 将区块链接到本地最长链上(同步区块)
+ }( t( G! z7 R0 O1 J, m' v5 r4 N$ u9 X  [( E9 K: L. k
c. C 将 A 的智能合约部署在本地区块链中。
! L, W5 _; z1 K: s4 L7 v! H2 Y4 H; {/ d  }" D+ D
-区块验证过程-
% B1 \' c3 E5 I- d! q( [2 _( O) J; R8 s3 `9 u  b
合约执行4 D) C/ Q6 ]8 W3 ~3 F- X: Y

( n' w" U9 _5 i5 n-合约执行过程-
% b& ~1 A$ n. |& a# _) m5 W
2 g- \; `& O/ b/ e! j' a用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。
# `0 e0 b- D. X7 @( k. E; P  y9 @7 m$ v7 L4 S: A) x% h
B 同步到此交易,检查交易是否有效、格式是否正确。0 B3 h# U$ J2 u! X

/ ~3 r4 a9 X' p' @符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程.) J0 d% i" J+ g) ]( P

7 d$ I" D$ @$ h$ R7 k+ s, f; TB 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。8 M/ d0 f$ i; C+ u3 y
* q( `5 b5 W. d
C 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。1 d0 a8 M( r1 y' B, U* Y

8 ^3 w' {* S0 V$ M* u' o网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码' @2 _$ x' s0 k% F. h# o; p$ g
/ l' b/ P& k( k
合约升级
8 l4 c6 t8 X8 `3 {
- e- B2 E7 F) X" K, f5 K/ n9 e部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
+ D" X1 W8 @/ E: B4 ]( U; {
4 Q) T- E5 N; K5 k智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。, l* o' W- S3 ?) r) |% P
0 k! P' u, c2 p. U0 K
hacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
( ?# k- d$ Z1 |. ]$ ~& I) C% _6 P- D  R& Y
合约销毁& [; d: T7 w+ X; C" d  P8 H

4 ^4 _1 b. {/ m3 p" t9 `合约发起者可以调用 selfdestruct() 方法即可销毁合约。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2