Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
274 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-
6 \/ x+ a8 v# f7 W* ^( A; B
' U2 B, I/ v$ X3 x首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。* C) u5 X# b. g/ V+ m
* O8 J) b0 s1 I/ v) b4 [# ?" V
其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
* [7 p2 a1 a6 T& ^- m8 Q3 a9 n% R" F
再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。! e: x. X1 s: g5 h9 S' d
: R  j  K2 e* \# j# G- m0 x
最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。
$ W. c# ]# ]2 |) m% v
2 d: W- d: R  R2 h/ {* O$ j9 Z合约创建4 V) `/ O5 r- o6 N! I0 \3 ~& B5 m

: F! u5 o: M' M9 f这里我们用用户 A 的例子做说明。
/ i4 R: K8 q" B# _7 i3 s# V! t5 }: U- E9 W7 k% l$ J; R( h7 O- q
用户 A 使用 solidity 等语言创建一份合约代码
1 I3 u/ l/ Q7 z% ?7 Y8 G) T; D5 p$ p5 T( V; n% b
A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)
- q2 w5 r* }5 a3 h9 a0 g
. W5 t3 L  d! ]3 f3 W; X- m6 h客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。
( ]1 J! O$ H$ }# X6 g+ Z) @, j) p* l3 j* k9 P/ |. p' E
该 tx 广播到网络上,B 节点收到该 tx。
9 h1 h) u* e* e: q' \" |# R
2 y" S- D+ l& P9 ]B 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。- h: ]4 M* S! F# P2 l; `3 _0 u
5 z! N, v: a; x/ [
对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。6 q- k$ N8 u1 d0 Q! t1 I; Z

7 K3 V1 d, x& N  N0 k& ]2 z合约部署
7 c) u: {) [/ U2 b! e
8 e/ o$ x& z; T1 [! ?. O/ }9 ]. w我们加入矿工B和C。
! s3 o6 X: Z9 A3 m8 E& d  r* g
' k5 w0 \6 ?) z9 P5 O! `-部署与挖矿过程-
3 y6 n0 d* ?" I  B* N: z; r$ j$ _7 q) ]  h
B 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。8 L9 L& X0 o$ Q

! ], [' a' `, a3 k  G假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A
3 g: A) i  t) p" h, L
0 f1 R* W9 ~5 L* ?  Y9 FB 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。' |7 I; {2 p9 _+ `; Y8 Y
) r' [; ]$ R# n( c, P$ }2 W  x
C 接收到该区块,验证区块,如果区块通过验证:4 d- h2 H$ p2 g  n* v. p; H
, q: [* J  S% \& D* P/ p# t
a. C 从内存池中删除 A 创建的智能合约交易请求
% Q. Z6 ?% [# I0 T9 b% e" U$ G) s; p* c& O! D+ C1 E( t. E
b. C 将区块链接到本地最长链上(同步区块)
( W6 C% w6 l' f. E9 A2 C6 T& v3 O  c* U% o- M3 n( z1 e; m
c. C 将 A 的智能合约部署在本地区块链中。) ^2 A! F: s+ N4 {& A: y3 O9 D* N0 d5 n
8 b/ b& g0 z; o: v( s) |
-区块验证过程-  G1 _' E$ y# L

* s6 e9 u5 W" Q/ N合约执行. m2 N/ R* ?" n' |* E7 I
: \! X) \. P) I" |  p
-合约执行过程-
) P' p( w" F$ r/ S: K, N2 U; R$ [1 @/ Q$ }
用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。
- W0 Y! w6 t" ]  F* c0 G  k, J: h1 N
  {. E2 U# a$ _7 O9 ?0 {# t1 f: n: [B 同步到此交易,检查交易是否有效、格式是否正确。
( Y8 _1 D4 Q; J- F; i5 |1 w5 l+ t8 p8 g  L# q
符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程., p$ V" A+ k0 j% W  n! X0 D
0 a0 z) |; ?: ]2 ]
B 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。
0 H9 x5 K6 ^# K  q8 R! J$ ~5 U/ Q/ F# A( L
C 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。' F% C, W9 D7 D0 {* b; Z  m/ c' E7 Y

+ ?$ D' U0 ]+ C& ^$ X网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码! \# L: M0 F6 c* S5 R, B. r3 S
# {; h1 V0 |+ o( {1 P0 m7 u
合约升级
3 {. j3 q5 k. U! b, Q4 Y* ~" d* r1 X# |( h, T2 {, i- o  O7 u
部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)% m; D! t/ e7 }( F$ B8 u
; G6 A- S' x- b- i7 \
智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。7 U/ h/ V2 D+ K0 I4 U( [! A& l

, C# {2 H2 J3 Bhacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
9 U1 e& G1 d$ K6 X8 t! G1 f0 q0 q
5 h1 \& q1 D0 G' r& v合约销毁
9 W/ u5 }0 o2 S9 c. }3 W1 R
4 i) o5 e2 c$ Y. Y  Y合约发起者可以调用 selfdestruct() 方法即可销毁合约。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2