Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
solc:solidity的编译器: [+ d7 [% g5 P1 R1 x
7 X4 X* h: C, C
    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。
# f' t7 V6 H0 v. Y' H1 d1 z' @
/ f/ K: P, N: O2 \9 a5 o    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。+ i5 L% M* ]' C9 R6 }7 ?
6 r) k6 |. V% a1 }* x8 r
    solc的安装很简单:4 m4 Z! K$ S/ v; O; m6 I" B
- ]" J9 ?/ c3 z; y, s9 i
    npminstall-gsolc: ^. w& f+ T$ P; \0 K8 V0 i
2 g) _, w) m9 D' o1 _0 k, c9 f
    //或者$ a  Y; G5 q! ]4 h/ E

2 P) ]4 p$ ^' s) v1 J, q! D( ~4 b    npminstall-gsolc-cli
1 \) `+ f/ h9 y5 A5 V4 q
0 x; j* t" P# @5 u: u    //或者6 Y# h. t) {* S5 v
9 g. H" ~/ y9 P4 y3 h- m0 ~" S# X
    sudoapt-getinstallsolc
% O1 f+ V& m9 b" g2 E  x* A
9 ?4 y! c/ K# `  i; _! Z2 |9 C    安装完成后我们来看,solc--help,solc--help命令显示所有的solc命令选项。编译器可以生成各种输出,比如最终的二进制合约文件、语法树的汇编或者需要预计的要花费的gas等。solc--binsourceFile.sol,可以编译后输出一个名为sourceFile.sol的智能合约文件。如果你想从solc获得更丰富的一些输出变量,你可以使用solc-ooutputDirectory--bin--ast--asmsourceFile.sol。3 m) x6 ?* |! P, ^* p3 y$ z* ?

* _! ]# j- }: S) q6 x    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。
- O" ]  Z$ m/ ?2 z/ R' ?6 B9 j+ A( \, k  T, t; ]  P/ N2 W
    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:
9 h. K& t: s  Z, m$ E' Q, x- O  P# I( h5 j2 X
    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol
" K: H2 C! M# p) r  [! c2 c4 l+ s
7 e$ \# U" e& v1 ]4 F    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。, {7 c) `- l5 `6 z  r4 ?, l9 J
/ |  F: k/ e# o, p6 X% Q0 Y
    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。
) J5 O8 ~0 L0 K- x" Q& s$ ^& |3 G* b
    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。
9 O1 T) K4 m0 B
; e! U( _  A: ^    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。4 b! e; c% Q7 C4 l

) n  n7 d: ]6 o    如果用选项--link调用Solc,则所有输入文件都被解释为未链接的二进制文件(HEX编码),在上面给出的__LibraryName____格式中,将其链接到适当地址(如果从stdin读取输入,则将其写入stdout)。在这种情况下,除了库外,所有选项都被忽略(包括-o)。3 u) I3 J. l# g# f2 n; \, \

( p; ]: E4 U# x  r$ O    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。  K! p! M) e' x: T& m6 x' D

/ A4 e; w* S4 J( v$ u6 P    #solc编译器输入输出JSON描述
& K7 s0 J; A% s/ `* f) [9 A- w5 @
0 d3 Y" ~$ \9 w* G1 ]    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。( N$ K  h6 p1 g* b$ e

% n5 L/ S8 G2 l1 h1 G4 y    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。
: g, ?, w( W! }  f
0 i$ A) S* c5 I2 R    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。4 C& Z% x8 J+ `6 ~: _
: ]6 _. s/ l- o1 `9 X0 K" y: T: C
    输入格式说明:
& |  v! s4 L' }4 j# q- O5 n: A7 e, C) D# @
    {
( E) A+ Q8 ?6 o0 x0 r( p2 f' N3 y; N, e- w
    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.
* y" i4 f! |, a6 _) `3 u, n
5 _4 q" x3 K7 O4 z    language:"Solidity",9 g! a  X: D: Z9 B

7 O7 a" f% v- H0 e5 V/ C1 S    //Required( c- l. C2 [+ F$ |3 v

9 W9 H: d+ c. k    sources:: d! N6 `2 Y8 j
  Z; H' Q1 q+ U0 v
    {
% ]3 G2 ~  m3 k; e# [4 @, F
( P; s* x3 _% c, s    //Thekeysherearethe"global"namesofthesourcefiles,4 S, b  a5 w" `' `  b" x$ S9 z: U
# V6 P; ?, A5 z+ {1 e3 N, u
    //importscanuseotherfilesviaremappings(seebelow).
: n  j; y2 L$ w% n0 k
/ ?& c8 y( d  ]    "myFile.sol":
1 `. a0 J) p4 R7 b1 u
' c2 Q, w+ u0 c% L    {: _; b' p! k6 |5 U# ^" w6 t
# Y9 L; G, R6 s
    //Optional:keccak256hashofthesourcefile: {7 X) _+ G; D& @

& j2 ]. w* I; m    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.
+ x8 r. `( d. S3 j5 B, B, W4 j3 v. Z8 Y
    "keccak256":"0x123...",* k# x% J7 e' K. z( F& h
8 p3 n+ m4 y# B. Z
    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.
, e2 v" _/ Z8 C$ ?; e' |, {3 x" m
    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe
9 H- i8 E' F( B* I1 z6 G  Y1 Y$ V9 l# K  C% Y$ P0 C1 K) k  j) N
    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe% l. D  I" A+ v3 U  W, J
9 F' X0 |4 y9 _
    //URL(s)resultinsuccess,anerrorshouldberaised.
" l$ \# L0 a3 B7 h$ x' W8 a& l. D/ d0 F  M4 e) T
    "urls":
* ^  _" ^: U1 v: O; K# E; @% P  i; T7 q2 L8 C# L- g& p8 H
    [
: y" G% F1 C1 H) E: e1 U3 Q: Q3 U7 T9 W3 |8 M1 i2 t* T
    "bzzr://56ab...",
$ b$ x) L+ m+ J: [; }# ^& U' `3 _! V
    "ipfs://Qma...",
) n  Z* t+ u% M6 g6 U+ g4 |3 R3 C. c; Z. Z
    "file:///tmp/path/to/file.sol"0 t7 O" [; A4 u7 `3 ~" ~7 t
4 }( n' f: ~/ C
    ]+ C; ?- p6 G$ o! ?5 V
; }1 I9 g4 y' u
    },6 v& Z3 @- ^4 h  _- U
6 s* s2 ?& B% |: u: Z0 Z
    "mortal":
' w  M/ x( T5 W3 V
: q0 o$ O9 f8 R$ ^& W& V4 q    {
* h- {( d9 T- E6 H: b) m( J" ]+ P1 t! ~8 a; [6 }4 V6 C
    //Optional:keccak256hashofthesourcefile
# ^' f& V/ K7 j9 T8 c# t; A7 j6 W7 `
    "keccak256":"0x234...",
% R7 Y. ^# B$ ]( |& p
9 y; D) u' l! U    //Required(unless"urls"isused):literalcontentsofthesourcefile
/ A/ N- J+ |  }( V) j  U0 R
: i% @5 N* q+ U; f1 j    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"
4 R# T2 W3 o  m) k4 o5 d" a' q# l7 m* l
    }( e) J4 H" h, ]& f

8 J. I, O: e6 n, ^" V" V! L    },
) ]9 t9 M: Y  s4 U7 L5 U( w
9 r7 N/ u& J$ }, I1 ^# T% L  C    //Optional
# h5 {& x# E$ P, Q3 Y; _) z- ^
    settings:
+ w) ~) m% o5 ~5 `4 @3 }( J! z1 t9 ~) z5 j3 p% m; F  `
    {7 B6 L& j1 i5 F% J1 z5 b

: {! s. Y! i% D7 c- D    //Optional:Sortedlistofremappings
+ T) `0 P4 X/ I  @/ |
9 |7 V2 R2 Z. ]    remappings:[":g/dir"]," a9 O$ |0 b- R* R" k  O

7 l; f* x$ b  m2 g    //Optional:Optimizersettings/ ~* J  O- _& D( o/ ^" Q8 o) Z! J) o

" d. Q% P% W9 _  D( x) w% h3 g    optimizer:{
1 l& f8 ^1 Q5 @7 F- D7 y
/ G! |) g$ J/ K) m3 ~* G0 Q2 T9 n: i    //disabledbydefault8 h5 y* s( J7 r8 @. x# J& Z* i1 y

# R/ A6 t4 C; M3 R5 }    enabled:true,
! l5 D  C( n# W) H9 |) x' v% z; b- H% H
    //Optimizeforhowmanytimesyouintendtorunthecode.
2 C+ h* v: g- y: v; Y% w/ N& M% ^0 b6 J2 |, X% {3 P; ^1 T
    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.
9 H8 e) N6 q9 S4 @3 M
' v5 U: S) J5 F& p; j7 z1 H    runs:200
* d: ^6 f3 l$ _8 i: [8 m2 b
) Y& z1 Z6 ]( t* ^6 v    },
/ L. n9 P# O9 [& Z. b/ h1 _. m; ?/ N
    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople
6 O3 L  c. W3 z% l- A  X8 _, y. n; k0 j4 i( A
    //Metadatasettings(optional)
0 X$ L- p1 ?% a4 V1 v! u2 v* z
# s7 n' n( K( v    metadata:{- Z1 ?/ I0 V5 Z) m, w, f3 a3 W
3 M8 T& `- @" P# d
    //UseonlyliteralcontentandnotURLs(falsebydefault)- p1 ~1 T+ t6 Z1 |. D" \
1 S# K/ L* q! t* j# ^
    useLiteralContent:true) z& t0 W. Y+ J  @
3 }0 \( {; Y+ j; L8 f+ J# {
    },1 d+ k1 [. q3 x1 g' {! R
- E" ?/ b) k# ?* E
    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.
0 r# p+ ]2 F; d0 B( Y% n1 Q
$ H( o8 y$ j# U9 c, g2 u! T) V    libraries:{; s* R- X% {& q/ x5 a

7 \6 C/ T2 q8 ^8 D    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.0 K) Z: d( Y& O: F% z* A
+ ?. `( J4 S! w) m5 g! U$ k7 n
    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied.; n) ?& B8 L- ]0 O6 H/ e; B3 ]

! ?: ]- @3 ?4 Z. |: y) @. M    //Ifthiskeyisanemptystring,thatreferstoagloballevel., }" E1 F7 v* v
( ~# C" I$ g2 A  ]7 X5 y
    "myFile.sol":{2 _" V4 d2 H7 S' u; ^

6 Q% @  d8 ?0 [  K    "MyLib":"0x123123..."
& U7 `* X) t# i0 Q
: X$ D: z+ l  `! \9 H% O3 C    }
, i# U& N0 a- Q9 {; t% o3 c* H) C
    }$ X" @8 m, Z% }% T) |2 B
7 Q! G. d3 ~2 G( X* y7 v  `7 U, O
    //Thefollowingcanbeusedtoselectdesiredoutputs.2 u+ u7 |' @' t+ i0 Z. v

/ C$ O- \  S+ p& Z/ W6 l    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.
# k- t, e8 x  i3 C& C! A8 A5 E1 u# T5 C- p! N, H
    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,( n! o/ R* _* a- q9 ~! p/ {9 R

( y  `7 }& h0 `+ J    //whilethestarreferstoallofthecontracts.
2 {7 s) y9 ~- z5 i7 {: I- l. G/ k  |$ w& r9 p  b
    //
# D  S; E0 v% B- `
& ?7 u. k! q6 c0 I  [# n    //Theavailableoutputtypesareasfollows:8 h* h% q4 C. C. A2 y8 Y! `% @

( \$ F" ?! F! i; {    //abi-ABI
  A5 L/ [1 D+ d+ I- i, A+ W2 n' f  f; ?  g- t
    //ast-ASTofallsourcefiles1 v# H/ ]  R; e) A7 I+ H

+ z# m6 g8 a7 j7 j9 j6 C1 {    //legacyAST-legacyASTofallsourcefiles
. c& y* s" q  a7 y+ a1 b! H
. j: q/ h1 o$ p  T3 d: Y    //devdoc-Developerdocumentation(natspec)
! \. r* n# u8 y# q) z* }! \5 x: ?
/ x$ d6 G% o, e) x, k$ E    //userdoc-Userdocumentation(natspec)* \7 e5 o" A  @( d

6 s# T( L+ D5 z5 X- A0 {0 y0 i    //metadata-Metadata6 M, ?# f) U) |0 ~  n  R
. T, F" X+ L- x* T
    //ir-Newassemblyformatbeforedesugaring
$ d& ~$ S1 ^4 _. u' J2 H- e# n  R- Q0 G1 s
    //evm.assembly-Newassemblyformatafterdesugaring
2 `! }" {% Z5 I, @% h7 B7 U9 r. r1 }1 h4 f8 p$ l$ b
    //evm.legacyAssembly-Old-styleassemblyformatinJSON
" m3 t3 u  e, u) T) k  P& [' l" Q0 S, Z8 c
    //evm.bytecode.object-Bytecodeobject
( L" v# u' l+ Z- ]# o, X1 f
% X/ e  G* W9 ?  S4 W. ^4 Z% j    //evm.bytecode.opcodes-Opcodeslist
9 F6 R! C" p% p+ x  ^) }
5 h# A6 [" ^) |    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)% {) A0 Q, @( N( Y

+ y# x/ b, @' d; k/ j( |5 f& y    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)( U9 [+ v% o8 W) [' {
, {5 x: N, ]% g, D/ \5 g+ E
    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)
7 Y2 I0 @; s: `
3 i+ i; H7 S+ h. H6 k    //evm.methodIdentifiers-Thelistoffunctionhashes
8 D  W+ ^4 p9 O" ~% C3 w6 X8 }2 y) S1 Y9 _8 c6 [$ C7 ]" v
    //evm.gasEstimates-Functiongasestimates
4 G7 L, U& q; d, C( N2 Q6 |/ N  D# v: L6 h+ C2 h
    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm)
' ]$ i3 B) o: Q% j9 ]4 `( w: \/ e/ D' X0 I
    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)
: T/ D- ^% A, @# E$ d4 ?
0 [. a* N9 L  c' W5 l' [  S+ W    //
( m" f$ q/ e+ E0 a5 p4 Z
( f9 [( N- M* g5 Z5 L- B3 }    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery
7 x4 r: H% [% W$ Q; N
9 y. I5 H4 r: A* Y7 h' e    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything.$ K& ^/ ~5 P9 W6 B- @0 g
9 w5 y* p% E& C. D
    //
6 v( B+ W1 C" y" L
/ d& w; q* _/ l( r/ F9 K/ ?, t5 ~6 T    outputSelection:{
' d" Z! m* F+ m. g! [! N+ ^! k2 k( x: X; q* ^  k
    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.7 d- T, D& U: P: I
2 R+ E# Q" P+ u& \5 _: h/ x
    "*":{
: n. j' k, u+ Z: y
# @% C8 m8 K1 Y- L% Q, i5 k) g    "*":["metadata","evm.bytecode"]7 M- i5 \$ a$ F( M

+ W( Q' T$ [/ \; S, t. ^    },- e! Y4 ?% G( b7 V
- Y& o& n: f0 s  g% W7 U( X9 Q. J
    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.
7 o, X2 ?# }& W8 {
% E# ]* j- q5 `4 s; s# \9 T4 r. c$ |    "def":{4 c8 V6 ~! n. ^9 ^2 ?

# j6 H7 e, N" Z* g7 _7 w    "MyContract":["abi","evm.bytecode.opcodes"]; |- |7 `' E$ C; ~

) R$ p+ x0 j' K) |    },% O: e8 X( i$ {" I/ f6 S" w- }

9 R/ w4 ^$ O: K' U" }- i1 X    //Enablethesourcemapoutputofeverysinglecontract.
- V7 w, @. J6 O
' l0 }0 d7 C' ?# w( p0 W    "*":{
  A+ ?/ S* j0 B& G" ?* w5 \& D) A. W/ v$ }: q. d
    "*":["evm.bytecode.sourceMap"]
) a; e! e& |7 b; ?- ~( {8 _: p( Y2 w& i& e. H$ j; q1 K( Q
    },0 s! M0 M* }+ \/ ?! x; L* Y7 z4 q

" B, P0 J8 N3 t, q  ^( P4 I3 l    //EnablethelegacyASToutputofeverysinglefile.
* s" N. f1 D: g# ^2 t+ _$ w4 t
# P  h; @3 |! M    "*":{" q( Q2 P1 g8 E' [# k8 a8 J
6 G# @2 a- ]/ D: `* c
    "":["legacyAST"]
8 Y8 y5 _, r. V! y4 O1 W* ^1 G$ P5 x' q
    }
3 u) X) g  @7 ~; u) v# g/ M, m9 {, A0 C4 M& l2 U
    }- x- b/ ^" O' Z: |- [
' O) [7 W* G& b
    }
1 C- P4 n9 {* F% x1 j; g4 |2 J+ y1 ]0 y) {# F7 D
    }8 x0 \+ W  W# j% f

+ V- A+ G% b+ m) q( V0 ^( b    输出格式说明. G  v& W- k7 s: c

  r5 [( y' R0 E" t+ Z    {
" _# X" c. N  V: k' W4 o% Q. G4 d
    //Optional:notpresentifnoerrors/warningswereencountered* g' B0 ]( r6 I

7 ~2 o8 n5 k' j0 Z1 J    errors:[
, f7 P4 j) ~$ u. h9 ]- U# O2 `' R) F1 W  g5 z" _7 A$ ^% ~; R, F0 D0 \  X
    {$ Y2 K2 I% }2 U7 C% f5 H$ Q! @8 j

: \( T6 Y# o1 `8 h    //Optional:Locationwithinthesourcefile.
: S" o! L7 W2 n0 T- _' }
% ?: J! C, \' l8 `  D    sourceLocation:{+ p* A4 x% ?# v7 P6 H" p+ d

# u1 h8 `/ A7 _2 t( e2 d& B4 H' Q4 }    file:"sourceFile.sol",: X$ A4 ?$ L4 I' A1 i
) R. s' P6 [4 T- E: E7 S
    start:0,
6 T- l- W1 d+ K4 \- k& |
! O2 X% Q- }: }9 o) r6 p    end:100( x2 R. o0 S* N4 b9 ~! S" s

; `1 g, _1 f5 l. N; G    ],
4 }) E* G$ Y# C; K: ?
- j: J( H0 ~, n: q9 L; z    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.% p* l7 x; R7 g8 ]% A, p& s
# [/ Y+ r0 x* Y, O8 R! c' E
    //Seebelowforcompletelistoftypes.
, Y; X2 @3 |5 w: i9 i  D
2 D; f0 o7 o: L    type:"TypeError",
( r% R3 ~1 k# j/ \8 d/ p
  i( ?* j4 J8 w3 H1 k4 b    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.3 p' K6 S* F/ J' {
6 v6 i7 n, r3 B( x0 [5 P( c( L
    component:"general",
$ M7 D! z+ m: n! }! F
1 V( y; s4 b( b/ V" o9 T& X    //Mandatory("error"or"warning")7 o: Y1 P+ _  ]( H8 \
& p- @8 K$ p9 U" h5 w
    severity:"error",- ?7 I: j  h* v
% U# K$ O( c4 l, }# M# K
    //Mandatory
+ y6 W) B; g" a" B/ Z  D3 T$ N
* z9 v+ [$ p& c$ q) D; z  c7 @    message:"Invalidkeyword"
, N. E( w" w' k/ M5 q# z% L2 r/ k6 J, L2 a
    //Optional:themessageformattedwithsourcelocation
* T- p8 z$ A/ l
3 z: y; H6 p- o0 x; P" G4 H    formattedMessage:"sourceFile.sol:100:Invalidkeyword"
+ U" h  M/ y3 c( M2 r" y3 {# k$ I# W1 d( B' u, z+ i2 I& r
    }
6 f8 ^8 W& z& ^4 p1 k" y  F1 {$ \
    ],, U2 _/ y7 P! G* _/ |# Q; l; N

8 o) X- u8 M  d* o    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings.
. c& A, W* x, A8 r% ^7 T' ~% A! S) J$ C7 p' b3 ], ]: X3 Z+ b* `/ o; ~2 O
    sources:{# f: l( R6 l8 b) @9 H

9 u6 j' L; X! _$ g( ?( f' {, A" J/ D    "sourceFile.sol":{2 O& v- t! l$ `4 v7 s; _
2 x- t( C0 K: C+ I( ?
    //Identifier(usedinsourcemaps)/ d1 C# P5 ?# \# _( ~

: h6 u" L( }8 y7 M    id:1,* x% i' K; M% d. s4 N

1 G2 c% \1 B0 C, Y" v    //TheASTobject
7 ?9 R! ^& D# @; Y( b1 V& X% a) F
# c: b: s- S5 }& j1 _' x. j; H    ast:{},% P( X4 U1 o- I# o& k

2 L5 ?- ?7 M, N, c0 p, y+ z  U    //ThelegacyASTobject
3 ^; O- [9 y% r) d% m8 ~/ }# v; [+ ?4 Y  t8 z1 j
    legacyAST:{}
: D8 n) i! b1 s8 c0 n' C( [
2 D' X) m/ f9 M4 e$ Y% i9 }    }
8 ]: |& A  [- w: X- H+ L% ]' R+ z0 l$ D: O# B
    },( J; }1 Y1 Q) z. x9 ]9 ~3 a; A

6 j  J/ A  Y: J    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.' |8 a! j# m, g. \9 y% K

4 L7 a: d- d( S4 y3 t8 ?& [. Z    contracts:{7 D- v9 |6 R" W1 O9 J( h; Y5 G: j9 W: u

! l2 M9 d% I% O/ G4 x$ ~4 e9 O+ O$ T    "sourceFile.sol":{
) I$ A7 d8 c% b& @; f, ^7 `0 Q4 T8 X+ q4 _. h4 V+ I2 O
    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring.4 B  i" w8 A- j* [' ~: G
. x1 o' C% R1 u
    "ContractName":{: K9 E! v1 O% A) H& R: Q
5 s" b" c* V* {) h; a" v+ Y
    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.4 W/ w6 F4 X) p- d- c6 u, K6 L* P
2 T# }4 C+ I! v# ~# q+ r% q
    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI
8 [' x) W  L# c* i8 W( q# g4 C  ]2 q$ q( R- k
    abi:[],2 f* q1 v8 w+ _  C& f
, d" M$ c+ p( n
    //SeetheMetadataOutputdocumentation(serialisedJSONstring)$ E: k6 ?' K; I  f( `: \6 u+ R4 z

, s# W. C, U* \; \& O6 {    metadata:"{...}",/ h3 N7 F; F5 {5 q

" t( [6 _- G. ?6 P    //Userdocumentation(natspec)6 G  p4 r' D8 c3 C3 w  @

( v: d7 R( ?2 g% L- d    userdoc:{},! O: v/ ?. s0 A, K8 x% k

* H7 g) B% r0 I0 f6 [7 }    //Developerdocumentation(natspec)" T) |# k7 ~7 T% G% P/ h6 {

. G& ~8 Q: [' g6 L" Y# \* X- |* C; ~    devdoc:{},
, v0 h1 W4 r: y0 K3 c/ V* j7 L( f% C6 s; Q$ t/ A1 ~+ x
    //Intermediaterepresentation(string)
( }% c* v- X! u: g
& y& Y: i$ {# d: P1 j) W" w    ir:"",- ~; t9 p, H" |; P; V  W$ c' z
+ H* k& G' G  l6 c+ j: a
    //EVM-relatedoutputs
6 b/ D9 _, [0 U% v5 s  g; M; E% J1 m
+ W% e* W* M7 ^9 p) D    evm:{
- Z" U5 d, g0 h0 k2 Y$ t7 E2 S
( B1 \! E6 _8 q+ d& W    //Assembly(string)
3 M) X5 N# q! R2 c/ ~+ ]+ G1 F, A
0 Z+ |7 {* K9 o" L    assembly:"",5 [8 U7 E* i4 w2 e, J; b5 t
* V% }5 `# W8 |8 M6 H% E
    //Old-styleassembly(object)3 U& j% D# f( K) |& r; l

! q7 g/ R4 K) e/ F* i3 F0 h1 N) ?    legacyAssembly:{},
2 @1 K( O2 r3 O7 t( E( F# Z0 }- x! a  t/ ~7 O
    //Bytecodeandrelateddetails.
2 ~: N  Z. t: \
" Q( f9 {/ o' b2 E    bytecode:{
1 {5 c7 I, U+ ^; X& D# G1 f( @1 ?8 Z5 _
    //Thebytecodeasahexstring." r9 _) I! ^4 h, h1 m
: Z$ L+ c0 w9 e0 J( b+ S$ L
    object:"00fe",
. u- c( N. @! L/ U0 N6 ?( X+ f6 Q: O; n
    //Opcodeslist(string)
0 f' |3 y% m3 K. Y3 Q5 i; z* X, @1 C4 Y+ t/ o$ a; S8 H% r1 ~, J
    opcodes:"",
" }1 q* J7 m3 J6 O: h8 d6 w7 A* D+ S+ X7 V& T
    //Thesourcemappingasastring.Seethesourcemappingdefinition.
- I$ M& }8 W7 a! ?/ Y7 E$ t, _  x/ E8 p6 }8 d4 d
    sourceMap:"",$ Y6 u7 h/ D# X! ?

: G. H& n$ a7 Y# T( t: [* d: Y    //Ifgiven,thisisanunlinkedobject.% ]. m: z+ N. U! j

1 d6 u& w% z1 `) ^+ u4 r    linkReferences:{' Y( z; X! t+ x! p9 p4 l
, H$ [9 z; J0 {& z$ }+ y! E
    "libraryFile.sol":{
/ q) [9 n0 f  I/ O! q5 ^2 t$ Q; r. G( D  w/ A) c5 O* [2 e/ @9 S
    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.' x" A  f! Y3 r1 o
' t" Z; V& J/ X: H, ~% r  |- q# G
    "Library1":[. u' z4 q* I# ?7 `( t4 w0 d

) F* e. C$ N3 j$ v9 j1 K! M# o! [5 ^    {start:0,length:20},
! M7 _# e& q0 V
+ @) b0 c# l5 j* d3 X    {start:200,length:20}& J$ ^. i9 `/ D$ [! \' X

3 o, w) r( T1 U& d. {9 T' `    ]
" k3 i" |4 |( k5 i0 N
) ]- K, H$ K) s    }9 K9 q* @+ L2 t7 ^  y

2 p% W; [$ S# I) e6 n5 f( O    }
3 E7 y; u3 }5 @5 S8 L2 b, O! s( d" }
" @3 {: u+ a& j4 f1 z7 W! t' p2 I4 [- p    },
# [! m* h$ Q' S( m# N  X, q* M% o. _6 H' t% v
    //Thesamelayoutasabove.0 x. L* p3 [* j0 ]. L$ l

! c# G6 {+ i% Z! z    deployedBytecode:{},
6 g3 w1 }$ Q* g9 m0 I, }- e
( I: x9 `+ m/ }4 \    //Thelistoffunctionhashes
9 |! I9 a8 u1 N1 T5 \2 T& |9 w, I) a
    methodIdentifiers:{0 J& Q; P( P- m' g

! E. p  J" E: z; B    "delegate(address)":"5c19a95c"6 ^0 T! ~/ ^4 {# C4 p
7 h) G& v$ w: |6 X/ y
    },
9 U! ^; c" S/ s0 l1 c( R4 x! J: }" p0 [9 f$ g9 ]; J. L7 Z4 u
    //Functiongasestimates9 g; q0 E" Y5 @# B8 n7 N4 U/ w- X
5 D$ y/ G9 K2 o- e0 T$ i+ n# t/ t5 U2 A4 h
    gasEstimates:{* ?4 H9 }( I6 g% L
) t9 x$ K/ q: M) m- ~/ @
    creation:{7 B9 g- {" y) ~; C- u
5 D" j9 V# O4 K/ U
    codeDepositCost:"420000",$ H5 Q; G) f- L/ ~4 ]6 Q" e/ n/ N" s$ ~
: `8 H* O$ {" I, T/ R  N
    executionCost:"infinite",
, x# X5 ?# G6 t9 R
5 s( i# z/ y0 Y    totalCost:"infinite") Z$ S& R' }* b2 V! F8 U) r
$ B, d3 O2 c+ M/ X( T2 S
    },) [7 H' g: E$ Q# g7 c  r

$ p. q6 h+ M- S  E( b    external:{
# q+ m3 \, K4 f* q0 ?3 U# `, D; Q# a2 j" d7 D" ~
    "delegate(address)":"25000"& H3 J: s5 r6 b- m2 p" X

6 c( n$ O! |& c    },6 q+ ]* M4 K; Q, j) t7 D
% i2 {/ w, o1 y+ A: d8 n  R+ N  w# Z
    internal:{) T8 p$ l5 H) T7 ]1 s

* A) R3 }& o/ X) `# T0 X- b    "heavyLifting()":"infinite"7 r$ ]3 v; W5 a$ U: B7 ^; h

0 V$ `9 U7 X& Q    }
1 @' n1 I) o! ~5 i8 ~) h; C) W7 s# [/ t6 o# R5 |$ l, l8 ?* y/ E
    }
9 {8 }- F; x& m
* i- i3 [2 }$ }  g. }! ~3 R    },6 l' t$ ^' i1 _7 M- z' p
$ n  U2 h# n$ F% d" I
    //eWASMrelatedoutputs
9 `- r9 ~0 k) O* K- l( ?1 ^5 S* ?+ r" b* e
    ewasm:{4 U1 z) o+ F! S' E. f  J$ C# T! Q) Y; |

2 X# |7 j# U! P1 s; q7 o, }    //S-expressionsformat
5 b1 C/ R, R7 c- ^3 B# X
2 `! L8 x2 \  \2 X    wast:"",
( \- Y+ }+ O8 Q& K, ]* ?1 w( I! u6 ^' \6 U- G) n' ?( i2 ?
    //Binaryformat(hexstring)$ s& i. o% J. v0 g( p; E( N
! a! ^) [/ ]& o3 w. a
    wasm:""
: s  z: @/ e$ g0 k
5 s4 f. Y$ w, T& w7 ^1 j    }1 j; R2 U7 Q: d( y
) V1 E( D' S1 Y5 e
    }
$ q- x9 L( I" r# }: E9 o1 i
; E; s3 h' N  M1 Y    }
1 `+ Z  v1 v" X2 ~
8 k/ T1 Z! v0 }7 q& S    }) c1 b8 Q3 M; E
$ r3 g) @" R" o8 b# a  e" ^
    }8 R1 V2 b6 E+ \+ W
! \; N2 ]- f0 Z, M5 l# Q8 b
    错误类型说明:
# s. F/ m0 }) l+ i, b& A
7 s4 q* w3 q9 n- }0 a   
; n$ W0 r4 m; \% M, b, r, a/ i1 o3 c& ~. B- A
    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。
* O% R. \3 w: j! {+ ~) g. F/ J- w1 u: x: ^/ |1 ]
    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。: W, w% F+ D* K+ z
0 E: n7 m9 u5 H0 j
    ParserError:语法f分析错误,源代码不符合语言规则。
1 K; q7 C, V, ]1 A1 _9 T$ x& Y$ I* x9 S$ |0 B. N  J
    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。8 \& W4 a! y% \6 O+ x& ~! u
8 Y. c) z! a2 `
    SytRealError:语法错误,如continue在for循环之外使用。
4 S2 Y( {6 M, J$ d* u/ ?# S" b, r8 ^- j/ m) C' q8 b
    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符" c% l% e, F% D, j) D. {1 P0 Y4 d

6 h6 {# r2 \* n0 ]8 g% u9 g" _    TypeError:类型错误,如无效类型转换、无效赋值等。$ L6 Y5 |# K) K1 L# C9 s! O& k

+ [  p0 d* s9 k* a    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。
+ g5 h& Q7 n2 D3 J6 d" _/ Y# P. D. v* H
    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。- B' T* K0 g$ m7 N* D" o5 l

3 t9 V# i, V/ m" Q+ v. \9 F4 c# V    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。
( m) S7 a8 P) b* L! M- F' s  Y/ S! v( X
    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。! \. n5 O" L1 y" G( p( O0 p. ], N
  r3 N: t9 ~# E
    FatalError:致命错误,这应该作为一个问题来反馈。2 }% L, t  S; }. n, `8 C, y

1 {/ w/ p4 L, a3 L  w: b* b    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。! l5 R7 y- @/ C( e+ S

7 s1 c. R6 Z3 D" X/ z    , ?( f  b  o3 Q0 m: `

+ o2 Q4 R' g7 a& r0 Q8 v    原文请访问:solc* f0 g( W4 Z" k1 f( N
% s9 g/ c/ V' p4 `
    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:3 I& B( b- g3 |5 i7 F, I: [# F
( `) g! n$ ]1 i* c" [
    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。! E+ A6 U6 ~/ f% @! I4 J
/ I# v8 X$ ^6 ^1 X! I
    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

曲水流觞113 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4