Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

只铃识
252 0 0
-以太坊上两种账户类型:a) 个人账户 b)合约账户-
" v0 G3 J1 ~& h6 g! h  Z$ R1 \" x% |3 E) y& k+ `9 W: \, B' C
首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。
  B# r. ?* D2 }# Z* a
8 e' e4 v( N3 f6 G# c4 m其次,合约在部署时, 就会创建一个合约账户, 合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户 codehash 指向的存储区域;codeHash 是代码的 hash 值,创建后不可更改。
& o  {) \7 h% x& w# X) W7 _7 V  n( M' X
再次, 数据主要存储在账户 storageRoot 指向的存储区域;storageRoot 对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。( [% J: C6 |4 ~9 y4 x) l. C( y! g

/ b  B$ K  `: P9 P0 f, @) J% {' V$ r0 _最后, 所有的基础存储目前都基于 leveldb, 一种 kv 数据库。* J: s2 _# S& M" O% ^3 V
8 B$ l; R7 T& ^# R" g7 r& y: g
合约创建
- ?- n7 {0 y0 c
  f5 }4 Y0 R# C1 l4 x! ~这里我们用用户 A 的例子做说明。. J1 U7 I" X9 J. Z4 R( C

" B' x+ Q1 J) P8 x) W用户 A 使用 solidity 等语言创建一份合约代码; o4 t4 B' l+ K& ?3 N, x5 M) r8 H" b
6 t0 g$ o/ x( y* g
A 在 IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写 data,然后确认(即发起一次transaction)
0 Y" L: w: l4 g, f& l' X" G9 R  }" g) D7 O3 u, C
客户端会填补 account nonce(tx计数器)、compile solidity、签名 等操作,并将 to 字段置零(代表合约创建)。/ k. P: E" y6 y: }* F" u# w
1 R3 ^' j7 m# G( c! h3 l: f
该 tx 广播到网络上,B 节点收到该 tx。
1 E% [# d& w0 R& z6 L# H$ c
; o" u1 L% h3 L$ s4 yB 节点检查 tx 是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
( x5 i) B( n% `/ z& l/ p* J# _" i* |# t; Y; h$ ^
对于符合要求的交易请求,B 将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C 收到交易请求的节点重复用户 B 的处理过程。5 T- e2 i* W3 z; j& F

2 Q% F2 Z' \9 z& ^' {合约部署
* V: ~: w1 w- c) R9 [3 g
! h) [; ~/ d( ^: t% l我们加入矿工B和C。% ]0 A/ T  \" k. ?9 M9 w

+ `0 L- d0 O; A! `; W9 C-部署与挖矿过程-
/ V& c  B0 s8 R0 Q# U' o! w, |* |
$ x% d- Z* h. c6 c. g9 h2 O3 ]  iB 和 C 各自从本地的交易存储池中拿到一批 TX,然后打包进行 hash 计算(挖矿)。
" c4 {1 |% k& Y2 e8 C- p4 x5 |1 }0 `% P9 S% w( h
假设 B 挖矿成功(获得了记账权),B 会根据 A 提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的 tx 确认后返回给 A
& F( F' @0 F, ]* L. f
5 \; n7 X7 i: l) X7 v, w- KB 打包好的区块(包含 A 创建的智能合约)发送至对等节点,并在全网传播。- k5 \! U  x$ B6 d

: I' K! b$ A% r/ H# ?9 [/ \2 \2 oC 接收到该区块,验证区块,如果区块通过验证:# e/ ?& b; {( `2 _
1 D0 W$ |- x8 c5 B8 L2 G
a. C 从内存池中删除 A 创建的智能合约交易请求" |1 x8 o# q( o1 n! ^: p9 G

" v( c5 @+ a6 Qb. C 将区块链接到本地最长链上(同步区块)
  f: q! ]6 h9 D% h1 Z) a" |! e) W4 x  ]
c. C 将 A 的智能合约部署在本地区块链中。8 `( n$ Q7 P3 t2 X# \

0 {" W5 c% L* F/ y; J* y' [' g/ R: r-区块验证过程-7 E, M5 O5 c: S. h4 {, W
- r) K  _  q7 C8 Q5 \4 j
合约执行
5 L* O% ^* |/ h/ b
" j' W: k2 q  X-合约执行过程-. r+ U8 n) x% K5 f2 |" u4 Y. Z

! u4 k) h) H* v/ o0 a, d用户 A 按照一定格式在网络中发起一个 tx 请求;该请求被网络中节点 B 收到: i. 如果符合要求,计算可能的最大交易费用(最大交易费用=Gas Limit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用 ii. 如果账户余额不足,则返回错误,这条交易被直接丢弃。8 n5 t' f& X1 R- C" r

5 B% |6 }8 r' S. _' ]; o2 aB 同步到此交易,检查交易是否有效、格式是否正确。
7 u3 {. O; e5 b( D" K" V; D2 ^7 P8 }6 J' @
符合要求的交易请求,用户 B 将其放在交易存储池中,并向其他节点转发. 其他节点执行和B同样的操作过程.
2 u2 @5 I9 M, A4 ]8 Q
3 ~. K' {2 A, U) Z. [6 e. VB 挖矿成功。 a. 对于转账交易,B 将该交易和其他交易一起打包到区块。 b. 对于合约调用交易,B 将该交易和其他交易一起打包到区块中,并在本地的 EVM 上运行合约代码: i. 如果代码并未结束而 Gas 已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。 ii. 如果代码运行结束 Gas 还有剩余,那么B只会获得消耗 的Gas×GasPrice 作为手续费,不会收取剩余 Gas 对应的手续费。 c. B 将包含 A 交易请求的区块传播到对等节点,在网络中广播。
$ B8 T0 b8 f7 p4 P  O" z
* s) Q7 w; W  iC 节点收到该区块后: a. 验证区块(用户A的交易的合法性也被再次验证) i. 验证通过,C 将内存池中 A 的交易请求删掉,同时将B的区块添加到本地的区块链中 ii. 验证不通过,C 丢弃该区块。 b. 执行区块中的智能合约交易 i. C 在本地的 EVM 上运行该智能合约,并与 B 的执行结果互相验证。; A4 V: u- ?5 w0 X& t; R

% h& M* D& {2 P5 v8 T5 [$ z网络上其他矿工节点重复 C 的执行过程:通过 EVM 在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。 a. 理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码5 c" b" h5 D% O5 b& a

3 W# Y2 g4 X% s) Z3 u合约升级
/ t3 H7 }1 n4 [4 `7 ]* J$ @
" a& F- A5 C/ f2 T7 ]部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
8 A# L" q6 L; j( h/ E3 ?) u/ c, Q9 r8 J  u
智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。: \* w2 p9 S% Q1 E

0 M% e* Q% w: ^( n5 R: z$ a' Ohacking 办法: a. 部署一个拥有调用转发功能的智能合约 b. 将收到的调用转发到另外一个包含逻辑功能的合约地址 c. 当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。
( }' F7 n) @3 ]- A& j3 L5 i7 b! Q
! W1 X3 O. s( U! O  F, G( n合约销毁# W/ t! U6 S0 u' H

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

本版积分规则

成为第一个吐槽的人

只铃识 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    2