Hi 游客

更多精彩,请登录!

比特池塘 区块链前沿 正文

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

kknini2
84 0 0
####第一站:合约存储- Q0 B9 l' C; S: Q. t4 L2 n" L

& b/ l  U' k1 v. ?3 k$ J7 c  B    以太坊技术详解与实战.闫莺;郑凯;郭众鑫编著出版日期:
% W$ {/ H- a5 X# t9 w9 k" m) N
; j" {8 g" _$ s  A  p( \    -以太坊上两种账户类型:a)个人账户b)合约账户-
  F6 P9 Y1 n9 k: X
# [% P' e& p/ R' j/ x4 T% c# @    首先,以太坊智能合约有两种类型的账户:外部个人账户和合约账户。这两种类型账户的功能和特点都不一样。6 u: k* {! A; `' h9 }; M7 H9 S

1 K1 m- M9 m; i) K    其次,合约在部署时,就会创建一个合约账户,合约代码的可执行字节码(Bytecode)保存在合约账户(CA)中。具体来说就是存在账户codehash指向的存储区域;codeHash是代码的hash值,创建后不可更改。
" `( }" X% C, f$ V! ]  q3 p" W: F/ L; O  v- q8 D
    再次,数据主要存储在账户storageRoot指向的存储区域;storageRoot对应合约存储结构的MPT树根节点hash值,通过它能够在数据库中检索到合约的变量信息。6 v, i$ B9 ~/ I5 J) Z5 I

0 A3 M3 G  N# g: l& S& W# {    最后,所有的基础存储目前都基于leveldb,一种kv数据库。
! j0 B0 i, d9 X4 I9 t8 |! I/ Y% {+ k# r$ f" O! E8 R& h
    ####第二站:合约创建
  ]. ]' ^4 i' W4 r) Q7 j( |! q) T) K* v- }- q+ K+ ^
    这里我们用用户A的例子做说明。
+ r/ f- E# F. I* P+ Q! L2 q* v  ^/ I/ o+ {
    用户A使用solidity等语言创建一份合约代码
4 e, Z7 H3 _3 Y: D7 c& U: ?) [
1 ^% C# \6 m" u! C* K$ m* }" h3 q    A在IDE/钱包/其他客户端,按一定的格式(from,data,value,Gas,GasPrice…)填写data,然后确认(即发起一次transaction)
" Z% u6 X0 a" d! [% C
8 P5 z+ E- O& R% r8 b; L( q    客户端会填补accountnonce(tx计数器)、compilesolidity、签名等操作,并将to字段置零(代表合约创建)。
6 M* H- z0 z* a# |. v7 G  g6 M' F4 P4 v! ^
    该tx广播到网络上,B节点收到该tx。
+ W& W8 z: L: o0 X  ?: }7 R# Y! v3 u5 n" B2 N' V' Q; [4 O6 j' p
    B节点检查tx是否有效、格式是否正确,验证交易签名是否合法。如果符合要求,计算可能的最大交易费用,确定发送者的地址,并在本地的区块链上查看发送者的余额,如果账户余额不足以支付最大的交易费用,则返回错误。
" x( s% o% B8 r$ |" s  r; v  ]8 ?
    对于符合要求的交易请求,B将其放在交易存储池中,并向其他节点转发(比如转发给了C)。C收到交易请求的节点重复用户B的处理过程。
6 c1 n' [% Z/ @7 W5 u: _0 l5 X: M: ?( b0 N1 \4 A1 N( J) A" z
    ####第三站:合约部署1 u5 N3 c+ R; V# L9 A
; w5 q$ ~5 ^% Y2 s- }9 C
    我们加入矿工B和C。
* d5 Q, B9 E/ @; S9 T8 h" [* P4 \/ e; e7 l$ E
    -部署与挖矿过程-
- h8 M  N( G# x: k# L
% C) x  N/ n% L$ r    B和C各自从本地的交易存储池中拿到一批TX,然后打包进行hash计算(挖矿)。+ @  N+ D, C0 I& N( G" P, L% b+ X
+ s5 l" _, P; }# u* U3 r
    假设B挖矿成功(获得了记账权),B会根据A提供的交易费用和合约代码,创建合约账户,并在账户空间中部署合约。合约账户地址在创建合约的tx确认后返回给A6 f; v5 k! g7 D9 L- ^$ ^' v. \

; Z9 ]; h! ?: P3 }3 z8 L; ^    B打包好的区块(包含A创建的智能合约)发送至对等节点,并在全网传播。
# c) V9 T; j3 w1 x2 D2 K# f- b" R( X7 K7 z3 W
    C接收到该区块,验证区块,如果区块通过验证:
9 R- X; |9 s& W4 s8 s8 J6 y3 w' j' O" j, x/ ]1 G; z4 |
    a.C从内存池中删除A创建的智能合约交易请求, Z/ S; h7 D& `4 M0 k
! ]% E0 j  m; K- C/ R$ W# {3 H7 H
    b.C将区块链接到本地最长链上(同步区块)
8 d$ ]" K: h9 K/ |. K7 N* r' g4 G% i3 J) C4 f, h
    c.C将A的智能合约部署在本地区块链中。, f+ ^6 E4 }, j/ L. \$ |% o- _
# o* ]5 m; U0 B6 M# P0 @3 h( c
    -区块验证过程-
  L" ]% p+ ]$ n
( n8 M% {3 V% N    ####第四站:合约执行
7 @2 ]2 ]4 H. v$ @1 \5 E3 R: y6 P) J: u1 q: x* z' b- H
    -合约执行过程-
$ o; x* D% H/ L3 P* B* p' f6 I# ]- L3 |1 h, l# T7 u1 l
    用户A按照一定格式在网络中发起一个tx请求;该请求被网络中节点B收到:i.如果符合要求,计算可能的最大交易费用(最大交易费用=GasLimit×GasPrice),确定发送方的地址,并在本地的区块链上从发送方账户中减去相应费用ii.如果账户余额不足,则返回错误,这条交易被直接丢弃。! Z( |# z/ L& H& y* a0 b& n! d

7 j& H  Z: N% {; }" T6 C    B同步到此交易,检查交易是否有效、格式是否正确。5 d0 M  ^0 s7 a2 k6 @

% I' Z: l2 a. c2 [6 ?    符合要求的交易请求,用户B将其放在交易存储池中,并向其他节点转发.其他节点执行和B同样的操作过程.' U8 e) O$ a9 ?% Y  Y9 C
9 i1 S1 B8 R  m- ?0 ]. Z
    B挖矿成功。a.对于转账交易,B将该交易和其他交易一起打包到区块。b.对于合约调用交易,B将该交易和其他交易一起打包到区块中,并在本地的EVM上运行合约代码:i.如果代码并未结束而Gas已经用完,那么因代码运行而改变的状态回滚到代码运行之前,但是已经支付的交易费用不可收回,交易费用由B获得。ii.如果代码运行结束Gas还有剩余,那么B只会获得消耗的Gas×GasPrice作为手续费,不会收取剩余Gas对应的手续费。c.B将包含A交易请求的区块传播到对等节点,在网络中广播。
0 V; H: n9 a$ Y2 s7 |; [3 U1 v5 e& H
    C节点收到该区块后:a.验证区块(用户A的交易的合法性也被再次验证)i.验证通过,C将内存池中A的交易请求删掉,同时将B的区块添加到本地的区块链中ii.验证不通过,C丢弃该区块。b.执行区块中的智能合约交易i.C在本地的EVM上运行该智能合约,并与B的执行结果互相验证。
4 {0 h/ g+ v! M2 X- f# ^1 _( v; v4 w
    网络上其他矿工节点重复C的执行过程:通过EVM在本地计算机上运行智能合约,作为他们参与挖矿进程的一部分,然后得出一个结果并进行验证。a.理论上,如果没有人恶意操作,每个计算机代码运行的结果都是相同的,因为它们运行着提供了相同信息的相同合约代码。
" O9 O- g/ z: I$ i/ x- S' v
% L4 G# Y( U/ A8 I! O; n1 Z; O    ####第五站:合约升级
2 d+ @4 B9 X0 S& h; y. d, a3 O5 }- R, q
    部署在以太坊区块链上的代码是不可改变的,即无法重新部署一个新的合约到相同的地址上。(编者注:实际上是可以改变的。但需要)
- H1 h0 g) b( v( F8 q3 P6 k( e  p4 B' M
    智能合约升级较为困难,务必需要一次性将合约写"完美"(测试/验证要求极高)。; V) S6 x8 e8 V" b5 ^9 L
; X2 C5 s4 E- N( j" x4 j7 }" @
    hacking办法:a.部署一个拥有调用转发功能的智能合约b.将收到的调用转发到另外一个包含逻辑功能的合约地址c.当进行合约升级时,只需要部署一个新的合约并修改转发的目标地址,以指向新的合约。4 I" ^( }" f* E; [& {2 n8 O- ~
8 h0 u0 L* c  k  z8 x; A1 }
    ####第六站:合约销毁% ^$ h' K; ?7 V4 k/ F( v! T5 E: B% D
3 t. L6 w! m1 g, A, O, P
    合约发起者可以调用selfdestruct()方法即可销毁合约。举例:" g: ?; h. I2 z1 y) [5 _+ Y, t
/ c, [. y8 H0 i% z! S9 I) l4 I
    "A smart contract is a computer program executed in a secure environment that directly controls digital assets."
-- Vitalik Buterin
( r7 y8 q8 ]0 v6 h; O/ N7 Y
    作为以太坊的标志性技术,网络上已经有非常多的文章对智能合约进行了介绍。今天Cindy将主要带领大家经历一场以太坊上智能合约的生命周期之旅,一起经历合约存储、创建、部署、执行、升级与销毁的过程。4 `. t9 \& q# u' u! R
8 H4 ~9 n/ \) L8 M
    一起出发吧!
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

kknini2 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    1