Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
solc:solidity的编译器+ X$ G" u: q' \% E  a8 V' C
* k* K( x; Q7 M. T; u7 p8 X, |
    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。9 S# N3 y, t) V( I) B% w

" o, [" g# M  Z4 s1 m. ?9 {    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。
+ J4 k# i1 D0 v5 a" u- I! M5 [) d
    solc的安装很简单:: e6 R- g+ f5 i6 `6 q
  P5 c3 k! G) s1 G7 `1 _
    npminstall-gsolc
4 I4 u% t6 {/ {9 h5 F! v5 ^- F5 X$ x; W3 S- U5 w
    //或者
8 K9 a. Z$ t4 U$ z; o- r% @1 |& S$ O: o) k# ~3 z5 v, ^
    npminstall-gsolc-cli
0 H) N1 p6 j2 d5 v$ p7 ^# ?+ V! q, X5 _
    //或者
& r. H- `) i6 ^$ s
# Q- R; L0 I% F9 {) F    sudoapt-getinstallsolc
; G+ t/ z6 M; ]/ O1 t  ]6 h3 C7 L3 U2 |6 ?7 Q- v% q) S7 U
    安装完成后我们来看,solc--help,solc--help命令显示所有的solc命令选项。编译器可以生成各种输出,比如最终的二进制合约文件、语法树的汇编或者需要预计的要花费的gas等。solc--binsourceFile.sol,可以编译后输出一个名为sourceFile.sol的智能合约文件。如果你想从solc获得更丰富的一些输出变量,你可以使用solc-ooutputDirectory--bin--ast--asmsourceFile.sol。
$ K4 ]' Y1 t: V, r) k3 I% _% f
( O6 X* N3 J3 k) k    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。
) Z. R' K) u+ e$ d3 `, F3 _
* `1 `; u0 n% y9 [; n, i& b$ R    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:$ J, Q* n; G7 k% S" K
! O) V# O/ [2 f7 V  o
    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol
+ p5 `- z, T. S+ Q5 \' U, Y3 Q1 P# W1 G# v
    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。# ~5 w/ m6 R( c5 z3 w8 c) s7 h' U0 e
4 l/ l. ]$ d( V* m! C
    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。
7 F( X# o6 T! [: _9 s$ q- ?1 X6 _# b% K: v. ~
    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。2 _8 \8 V5 P+ ]: A6 q5 M" Q
6 K3 j; Z0 o0 c7 u, g3 u5 C; |; j
    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。
: A2 q$ ^% j0 b: }# o# Y* _- F$ d$ b4 ?% e) `" g; F1 M: C. R
    如果用选项--link调用Solc,则所有输入文件都被解释为未链接的二进制文件(HEX编码),在上面给出的__LibraryName____格式中,将其链接到适当地址(如果从stdin读取输入,则将其写入stdout)。在这种情况下,除了库外,所有选项都被忽略(包括-o)。- d. N" V% P% ?& o3 S9 l

. P! A/ O/ i. K% ?    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。4 U9 b' {& x9 E! O+ u# z

( T5 Z8 D( O5 x) g    #solc编译器输入输出JSON描述" W! _; s% S1 _# \  m

! u% C/ r2 @3 j, \/ d    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。7 Z( M, j! H  T0 O7 i4 l

- Z! }) M9 X: i9 ?" {    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。
7 c2 i. V* F7 `- h5 \" A1 _0 F4 @, t$ @$ N; ~; p9 E6 Y  R" t8 f' E
    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。: I8 ~8 i  G! b$ R( z; V, F

/ {# {& |2 G; M  _6 e2 c" A    输入格式说明:
* P, T+ \: a, w: j4 R0 c' @# M  s9 x5 |* J
    {7 V- j: k5 j6 v3 ^$ k) m; s7 |

, i- X4 I9 R& |) C6 e8 k6 h    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.
$ S4 d% ~, q$ ^6 W( {( k% ^1 q0 b4 h& x- ?5 F; K+ m
    language:"Solidity",5 b; S0 z7 u/ ?4 m
. ~% V$ N+ ^/ y
    //Required
* R2 l, L) L9 [6 C  E9 z2 M
4 U, ^5 I/ V8 W1 D( ?    sources:
! U" R2 S7 \) F' s1 ^$ |7 ]
6 N' d+ l0 h! p' H6 j4 P" T    {4 u& J7 W# j& Z8 G: M7 V
; |0 z. ~1 \, z4 f* B( Y
    //Thekeysherearethe"global"namesofthesourcefiles,
5 ?3 g7 S. Y& {
1 i: d6 d4 _4 {) \" B$ X3 i    //importscanuseotherfilesviaremappings(seebelow)." l! v. v$ e, c* u& X4 q
+ t% Q4 a% T4 i
    "myFile.sol":: j$ `/ F( ~3 A: Z; {+ r! @
! D+ {1 Y& M2 J: p
    {
, w; Z* E' t' T0 M2 z  _
9 h0 s9 f  ^5 {    //Optional:keccak256hashofthesourcefile
+ ], T3 \% h1 H5 _
: J2 B8 z+ y4 ^8 L6 k    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.
% l& A2 G8 A5 ~7 X! ?+ X) y7 G# Y" d& c( ?
    "keccak256":"0x123...",
! o- y* W3 d; O0 t5 D& u  r) T( k0 Y0 A/ N6 I9 N
    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.
& c" r$ m% W. |; g' H% J
. e. u% X( ~% \. v% \, L# I0 t7 j    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe0 C+ r6 ^8 Y4 A( y3 R
$ X$ |- b0 ^3 _
    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe; ]1 B" ~! j+ j

# X& X  V1 F; ]% x+ e  b    //URL(s)resultinsuccess,anerrorshouldberaised.  X  O" V3 O- d

& J+ |: E3 O3 h; m- M    "urls":1 ~, g$ S9 D. A: n! X. V

& l8 K3 i7 Q8 J0 V# x4 _' U    [
9 Z4 O" ^% i: ]& R. T
2 h$ C1 s  y" w/ g% W" T    "bzzr://56ab...",8 @, x" y: i3 K; x% [

% j$ v2 }- a. C1 [! r    "ipfs://Qma...",6 t) f0 N5 C( c2 A
! Z5 O/ `, t# P6 ]0 ]
    "file:///tmp/path/to/file.sol"
/ P1 k) m6 N1 f& }+ b, L) {' z( h( i$ C3 C) c8 V
    ]
; z/ z' e7 l( |0 x- L/ }; m" R. p+ \5 E
3 m% J: P% V  B5 y    },
# N: f- C( Q; J1 z# y" l* R2 X3 ]7 S5 C
    "mortal":9 H$ R' C* N) Q5 }5 D9 r

1 {; |* b9 d+ M) l1 ^    {" x* ?0 }" K% I/ r

' o6 _( Y( o9 `3 i( v$ y8 }    //Optional:keccak256hashofthesourcefile+ H6 Q; |2 y3 B+ P% o  _! ~
& b* {( o: [2 ?1 r9 w# e# |
    "keccak256":"0x234...",
0 P  `3 N4 a# d. w, N# g6 d4 c- z& u7 y1 b
    //Required(unless"urls"isused):literalcontentsofthesourcefile
- J$ v& o9 `7 d
7 g& b- T6 Z, _9 S    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"  g+ y1 j, @( Y1 V" @7 h: b

4 g" Q( w+ x& b' g; I! ~3 F- \) Y    }
5 \. G9 o# k! R$ w( u' V$ p* e4 O9 p5 x; t' L' ]8 V1 w
    },
% N- J, a: O* `, q* i6 u7 E" n  E7 l1 ^+ X3 ]0 c+ ?, g
    //Optional
0 ^: X: z: D' a* i  g  \/ m5 `' y- b
    settings:
1 a6 [  ~! ~' k6 N5 e
9 r5 ]% N( K; z5 H& K$ ^    {
! b3 F' k% |- X9 O; X1 a( x4 s5 B% B2 x5 W
    //Optional:Sortedlistofremappings
, x0 t& l0 i, P9 P6 ]1 F( r2 S9 b( @8 j( K
    remappings:[":g/dir"],. H2 n- W4 ^& E9 D: c3 u

, f% G( C: X. D" d/ ~4 I, F    //Optional:Optimizersettings( A) A% }2 L: t, Y8 W

6 I+ S5 v7 V4 b    optimizer:{" |' f: E/ |( B! p- b. n4 }9 O. H2 S! P
+ }! f) R( }* J/ A. q: H1 x
    //disabledbydefault
, j  _$ g( ~& }" J
/ e5 |# R8 ~- E+ O2 ~: c2 }    enabled:true,. b9 k- o# k  d) `4 E$ M# e

( Y( R7 p9 [4 T: h. E9 ^( u- A    //Optimizeforhowmanytimesyouintendtorunthecode.- v2 D" F- S; _; n* |
1 o* b+ x8 W, }( h! k
    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.
, ]  S) r) J, T  z% h
' t: v  D. t  M3 h* H, m    runs:200
& d& Q$ ]* n/ h4 B; d
( C5 T4 E) o- i3 g! S* [5 o    },
3 E6 S- W" p' Z) m
% N  `* B1 C8 P    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople
1 [- a7 @0 }. C; a4 w! `; K$ c; Y( u8 l2 r! a2 M
    //Metadatasettings(optional)
2 B  @9 H! j; r9 S# R7 O% B
- F% ]  j" I# e    metadata:{" B2 K& g6 d* M) P

% `; @7 p& W1 h" a    //UseonlyliteralcontentandnotURLs(falsebydefault)0 f  k1 c/ M  v, d& j2 N: R( s) ?
1 ~$ V. H+ H$ Y8 N1 s7 Q9 x+ B
    useLiteralContent:true1 p( M% r! A/ N5 H7 O1 I+ X
' B* V/ G9 L4 W  Q& |5 m
    },
6 F! A/ W6 U/ V! t$ q( Z' R. G& q+ |3 _, J! i( z2 ~+ g" s, T7 I9 t4 H+ m4 _
    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.; u, p. a0 n. K5 e
% l! z: s) c, J4 H' L
    libraries:{
; N6 j/ {$ L6 c! u8 h
* |2 q' d, ]  {4 n    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.
( G/ w' @1 C& o6 s4 S7 ]4 A9 |& S' [  f# a
    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied.
5 k" `- J6 a, \; p( C1 N( C$ g% z- I* U
    //Ifthiskeyisanemptystring,thatreferstoagloballevel.  t* V9 _% {( k9 [& ?

; L5 e- A, b" X% s    "myFile.sol":{! ^0 f# F' C/ f* |
/ F& Z) u* {4 I- T( W) ?
    "MyLib":"0x123123..."' U/ P* F8 e! C  X  T1 }3 G

$ _" L8 ]  N( ~4 Q0 f    }& s# j$ D$ E! Q7 X5 t) ^) `$ T
/ }( X# u( z0 X# O) q2 C8 ?6 m
    }3 T4 [1 _# Y- n' X1 z' N" Y

+ X1 H- E5 y: t- M    //Thefollowingcanbeusedtoselectdesiredoutputs.( d( p6 z/ @- L1 u3 c  Y
! X" \. ?# \9 c3 ^8 j9 D* v! I
    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.
0 {2 i7 p& ]; G+ J% p4 U8 C+ |
) }# A" p. X7 [    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,' l+ x5 H# Z- I9 Q3 E, X4 T" N
% q; l( m8 v$ B3 B6 Z9 s
    //whilethestarreferstoallofthecontracts.
# L1 d8 Y0 ?4 T! \+ |( E& w! d4 z, J2 H5 W6 K: H
    //
: r# U" H) B6 k8 i% [& ^: D
3 I  N' W# T- H: u    //Theavailableoutputtypesareasfollows:3 U6 M+ N# Y1 P% U0 l
' N8 v5 \# Z- F: N
    //abi-ABI, t9 Q9 N; @' I, z$ b* W5 E

( r8 T! a; z* @1 S& E- o9 J5 g    //ast-ASTofallsourcefiles
, Q9 m0 A9 r* o: M) y) _" I$ ^. J, `( s+ y$ @! p. `* Y. z
    //legacyAST-legacyASTofallsourcefiles" A% W: J5 G* [; Z
6 T9 W$ ~% z) n( \& M
    //devdoc-Developerdocumentation(natspec)
6 c- `1 B- V& W. `. [, [. @! O7 v7 Q
    //userdoc-Userdocumentation(natspec)8 u5 l6 N4 ?4 t+ p, b

: O' q4 f! z8 M- V. c8 q    //metadata-Metadata+ D4 C0 W9 `. p$ ]4 c

; h2 \- t* K! {    //ir-Newassemblyformatbeforedesugaring
+ x& q8 V2 R8 X0 t" W
2 R  K& G! r  ^$ K! n% i$ q    //evm.assembly-Newassemblyformatafterdesugaring( Z/ @  K; O5 Z' e& j1 y
6 Y$ H- }7 x6 s2 p
    //evm.legacyAssembly-Old-styleassemblyformatinJSON
  y" m* l  y0 T, {
* ~: M. u: y: y4 C7 r    //evm.bytecode.object-Bytecodeobject- N5 W( f3 ^# l% _) ~  `  G; b) \
3 S9 M; L( h5 r# I; u5 S% ~# r9 B
    //evm.bytecode.opcodes-Opcodeslist$ K% O- G& I: p

. X  @7 }7 w6 V9 @: s* }) [$ ^  G    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)
) Q/ h5 P3 _$ _# I) a/ \) K: n( \# u- p
    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)
: n7 i( P( N  R/ G( G# Q$ f' i: W7 Q2 P1 W0 l2 i3 k
    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)
+ i, [  m3 |0 a4 F! j/ m  a+ \9 T* \; [3 b
    //evm.methodIdentifiers-Thelistoffunctionhashes# a3 q, `/ L- v3 h6 `
8 S" Q  w5 y. \# _. G8 z, G
    //evm.gasEstimates-Functiongasestimates$ E7 X4 \, I) I, k- |  X

+ W0 @( M: i5 o: Y6 c. a    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm). p# w  k) l, O2 z
4 F$ y  i  u  F3 @5 x8 u: i
    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)/ }- g' L. ]% E8 e* i) E

* O0 Z) n# O( X3 g3 e5 A9 F    //
3 S) i+ C: i0 A* f6 G: ]
9 X# w% n7 n! j; \+ X3 m, B! Y    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery6 J2 q$ x, n+ S8 a( k

0 p5 g# k, e: o( r* m    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything.; a' q; G( v* a& E$ a
7 a- F1 b7 e2 a$ S, x3 b% l! m
    //( g* h0 l5 l2 x' W

+ _2 x+ W# j1 h) Z( j  ?* }% [    outputSelection:{
% K+ \3 b5 S% H5 j* A( U+ r" o& E. Z" ]) S6 O3 Z
    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.
& r8 J7 q  {9 S, F) g1 G# |/ S8 f0 y% r( V3 Z
    "*":{4 E; \- i, G( E3 r1 Z3 V
( G2 \; ^# K+ Y( ]  v5 M& i
    "*":["metadata","evm.bytecode"]
0 {) P, o. r; |! x: H$ Z: l
9 B! t) f4 t8 j7 O    },. V$ O. @( [$ J0 a0 [

/ m1 C, {! i* G0 H) e$ h1 c6 V( W    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.9 e. |% r% e  e8 v

) ~1 q8 h) K0 ?3 y8 Z/ R    "def":{& D5 b9 a. ~3 e

" }5 i$ x3 Y  `, \9 U% V    "MyContract":["abi","evm.bytecode.opcodes"]- Y  y" ?8 l% ^1 W

) W2 }, n: @, E- z; ?" T) [    },9 @! R/ t) P3 j- Y5 S: X+ |2 u8 u) [6 u

1 ?. E% e/ O) C! E9 g6 T    //Enablethesourcemapoutputofeverysinglecontract./ l/ H! ?1 i2 G! E5 \* Q
/ t$ P* K' }, R5 I
    "*":{
7 l3 W1 u1 E( o# H$ \$ m3 s8 m4 |3 q
    "*":["evm.bytecode.sourceMap"]- J/ N: [0 }! Z) W
+ l& d  \$ D2 T  A: U5 ?) U2 q
    },
% ^/ j7 d, W& n/ w% u
7 @% h' A. h7 ]2 G+ G    //EnablethelegacyASToutputofeverysinglefile.
8 e" O8 M' X& B; W1 U- x1 {- K+ F  g- V8 u! O
    "*":{8 X6 S, A- {6 T6 G

* z; h- R* O, l* ~    "":["legacyAST"]
9 m# q# n2 j! V% R6 _. _- R% i. L5 z" a' v. R. Y1 d
    }+ Q, w0 E" ^  [$ O3 w

' [" P5 V  y! o$ i6 G& e0 I    }
0 A4 d* N! w, n5 d( y$ [; `
: Q4 Y/ n* w2 m) s) F2 E+ ~% v    }3 F/ H+ z' `2 ~# `6 o

* J* q3 }  |6 v4 J    }8 F; q) h+ _$ ~+ i9 I2 i$ ~
9 ?  {3 z2 ?$ K9 N
    输出格式说明
$ u1 N. b' K: \1 d. t/ T# [7 u+ q5 @9 V$ C% S
    {2 O0 p( e& B; V2 S. `

4 D! ]9 o) r3 j  @- }" Y    //Optional:notpresentifnoerrors/warningswereencountered
* u2 P/ b' \% R' t% k# D
# K0 H( v% T1 ^0 F    errors:[
8 `$ M' [! u- m* r- y9 G/ V' y
" b1 _( }* W" @. K5 H    {
9 y" s+ P0 t2 @" H4 t0 W: K% j- D. ?% }% N( h
    //Optional:Locationwithinthesourcefile.3 g4 i. `. q8 V; L) D* E/ K& C

" D# [" j0 l6 b; J: \( u    sourceLocation:{
7 L* i) h, d. a) t/ J- Y3 W9 q" d* e! }+ S* E
    file:"sourceFile.sol",( i5 N3 G. X1 q/ l( h- F
2 k8 E, p5 h2 }* C; d
    start:0,
  G/ L7 {: h1 y
2 G8 ]/ l+ O& T4 o* @    end:100
+ e  i8 f# F5 r# B0 g6 Y. i4 F: l  e6 @
    ],
; F3 C7 c0 Z3 l
# p- M1 U9 a, x9 G/ f8 A    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.* w8 G6 z- y0 i* G

. i. i- S! a0 W5 H1 S    //Seebelowforcompletelistoftypes.- H8 m3 q9 @' A+ x
+ x( B( p: ?' F8 @
    type:"TypeError",: S2 G' C+ q: N1 u

9 W1 @  d# E! k! D$ F- l0 J    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.
. c+ O  T4 n7 N2 r# E+ h, \* d  t" o4 c. h+ q( W
    component:"general",; B0 b5 L+ K* K# j+ ?: Z

0 _5 G% q- P2 E1 F  K- b    //Mandatory("error"or"warning")
- q  P5 X' W, D% @- E* C- N$ b% @5 a' t4 e; G" T" E3 i- f. ?/ Y5 E
    severity:"error",. T: \4 x' X4 q9 b$ z

% N; R4 J; Y/ o    //Mandatory0 W+ ^* C- |) Z7 U" e0 }; m
8 @2 x9 z- _# o7 z
    message:"Invalidkeyword"
3 W8 e2 O9 K# K; Q8 c% K
) S) R# T$ H  N& ?$ G# w5 J    //Optional:themessageformattedwithsourcelocation
$ X3 l3 o0 V6 n6 s, c+ n  r0 M- q. M: R  l) [) R1 o
    formattedMessage:"sourceFile.sol:100:Invalidkeyword"
4 ~+ z1 M: T3 x7 Z4 X5 \& |6 @' Q) K! _. Z# |9 ?; S
    }/ w, q& e# m% i% l( `6 @# a

1 Q, m1 v4 T5 |; F7 Q    ],/ b3 y" F) h# A) {) [* w

& S% E# f! R$ @5 _2 ^, V8 t    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings.1 c/ D# q6 A/ @+ _# r- N
6 {* o* e. ^7 r
    sources:{& r/ m& @8 ?0 j6 h; h8 \4 p( ^; z

* {$ F- S1 n6 ~, \: @: \$ h: F; k    "sourceFile.sol":{- I. s' z6 W) C0 Q2 C
8 Q6 U1 v$ b! I/ d+ e% y
    //Identifier(usedinsourcemaps), }% `. Q1 R5 J  I' |; B
, ?$ X! ~2 K; Z% g
    id:1,; p; h% M+ A& e! U

3 M  U, K& ^5 v) o& q( w$ C6 g    //TheASTobject. r+ Z* P9 J- g# I8 o
* A4 _3 d5 i, a8 N
    ast:{},9 o+ I! _( g8 b' K3 V
% e7 {+ f( v/ f, }4 P# P) R; F
    //ThelegacyASTobject
& {$ X5 p- S7 I  W5 X3 j5 y# Q( q& z
    legacyAST:{}0 }" C- A% K  D+ |' G6 e3 @

' ^5 i9 U% I5 c/ Q( a    }6 `/ d  J" R- O& l; _3 T8 z
" X' O% b2 ]( ?4 Z
    },
# B& S) D$ E6 H# X1 G. ?$ D
9 W+ O; C+ c$ v8 P7 c3 Y    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.
- s. x1 d& M7 a+ \+ T" x3 o: q. f+ b8 @7 R( Y, Q4 Y2 k% B3 r$ J9 G  j
    contracts:{; j) h5 ~3 J8 j$ F' ]: {2 C

, l  r# H) s( }6 ]' b    "sourceFile.sol":{
& c3 \8 {. s4 T1 X& Z) X9 t7 O- p( W
; _$ K6 H9 ^$ z9 w" y& n    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring.7 \5 _8 a* \- _. J+ i

3 S' f# c9 F1 _    "ContractName":{6 I) r$ M9 |" k8 s1 h

$ c, \4 V% j7 [# u6 ^    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.
! u0 [' j& t5 O
$ a: j' Z1 m- b2 O  q    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI& i+ ?% U; a3 \: |. r. y, f

  F* ]& \' |! ~# ~# i% r4 l% E    abi:[],1 n; B% }  ]- B/ M  K1 v. z
; n  v. n: c8 w8 |1 e; O3 ?4 F
    //SeetheMetadataOutputdocumentation(serialisedJSONstring)- W( O/ F. v$ `; O4 w0 e
5 @5 C' _, ?6 K# b
    metadata:"{...}",# [& A1 p/ L' X( W5 y. q9 O: Z
. X7 [+ O. |. @8 P: [
    //Userdocumentation(natspec)
9 g2 o0 G+ P6 z# X  h5 |* a( y- g% E3 I3 A# @4 }5 h9 r9 i
    userdoc:{},
; ?+ N4 m3 p3 S+ n  f5 |- }! J
5 j5 X4 `/ w( l' W/ d: V! I    //Developerdocumentation(natspec)
* a6 U: y! c+ |) N" H% j
+ T: d) T2 Y' d2 J% H    devdoc:{},6 t; x! o& M! Y
' x: Q, j& ]' W2 r9 B
    //Intermediaterepresentation(string): k$ a' i- D7 U
/ M" q" M$ ~" F& {; M
    ir:"",% [$ N. Q5 Y3 s- n

0 Y% K1 o$ c$ g4 ~2 h7 A    //EVM-relatedoutputs
* [( Z7 w* Q/ j  u4 L1 S6 O! A
& U$ C1 m, ^4 e. ?; e    evm:{: k, ?$ n4 d) t; n! O

% \  e! T: C( L6 J2 d8 I7 \6 K    //Assembly(string)
+ ~2 A: [- W2 D
  `' N7 y; e# b    assembly:"",+ n. ^3 `8 z  z* R6 s
: T# O" M8 ~- [4 L5 Q
    //Old-styleassembly(object)
6 P# L1 v- }8 n& r( Z
/ b- A" i1 D% w& m8 @7 W6 J7 j% y/ o    legacyAssembly:{},) n( a- M5 {* z# U2 l

& l3 ?7 i6 Z  R6 p. Q0 n$ Z. h    //Bytecodeandrelateddetails.
0 B3 ?' g9 Y! }. J5 o
5 S' @, W5 \+ j8 a% K% d    bytecode:{5 u8 f# _; @. M& f! Q& P
& j) Z8 Y  R$ [3 l5 t; n; P
    //Thebytecodeasahexstring.5 K* R; a6 a5 {: N
3 S8 }* t3 L7 m4 S$ y8 F
    object:"00fe",4 \! w. Q7 y" e$ X: ^+ |
+ B( b  _- n6 ]: Z  x; I& t
    //Opcodeslist(string)
! Q0 Z  a* F7 {( R% O* V2 P9 G0 {  W
    opcodes:"",( w' `3 X7 Q- T4 R3 H

! e7 G- C, h/ |( s8 ^) Z# d    //Thesourcemappingasastring.Seethesourcemappingdefinition.
7 [8 h0 E* L, J8 G" s1 R, H5 A% I2 z, k2 E; \/ E
    sourceMap:"",. I1 \" O# C0 F8 n

- ?, _/ j2 C, R7 v* C. l    //Ifgiven,thisisanunlinkedobject./ O" \7 [* R6 s- i1 B) H7 `

3 k0 W( D8 u$ d2 c" @; a    linkReferences:{- E% I$ K0 a; }7 p7 ?. Z; Z+ B
# R* G. n% c, B
    "libraryFile.sol":{
' s; x3 }# `. G' b  e; }, i2 b7 a6 F$ H, o. H4 Y3 \
    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.9 ~" s1 @; J; z: d- v

% w! e$ x- S  s% d    "Library1":[# o7 n7 B. Z) C) X; ]

: k# h# [" R1 t    {start:0,length:20},
; Y2 H8 {$ n( a5 k9 A! Y: ~8 l; V; a- D8 p
    {start:200,length:20}, L4 {" d7 s% Z8 H

! |* `2 n( c# v/ t8 r    ]. x. f, z8 Q' T: ~0 ~' w$ l

0 r4 T( x6 {# i. F7 m    }
2 Q4 o( H2 H+ k7 A
: A/ j, R" b- n    }
! T# {2 E( j8 z5 K9 f: I1 v! R) [
! i+ R6 A. H$ G' Q- E* L, P4 H    },7 ~$ z7 o9 F% ^' A1 h
7 x+ G! \" t6 ~- y  n
    //Thesamelayoutasabove.
/ w6 w& }+ K+ m  d5 F9 D% e, A) i* F8 R9 A4 Z
    deployedBytecode:{},- T, ~1 B/ @2 o  v

9 c/ a0 j" l0 r. h) ~5 e    //Thelistoffunctionhashes. G7 _( l" N' Z
# G1 }) x0 m7 d- J# P
    methodIdentifiers:{
8 L* ]* ]* z3 c
, r+ P. U1 p' S    "delegate(address)":"5c19a95c"& ?- ~: n# h9 @- i

+ Z$ h6 |- Z) S# O2 u2 _0 c    },% K5 C: N- J. ~- h
$ X$ @. L+ E# i
    //Functiongasestimates
# X- s4 [& h1 n0 H
1 S  y' `; w( t4 q5 x; c    gasEstimates:{5 R, H' Q6 P7 y0 P+ K) \5 [

' a* d# [9 g2 i: R* ]    creation:{
! _' I& C0 O0 {' F7 e
8 k6 b' h! i! m6 f( K. ?; x    codeDepositCost:"420000",
9 N: k6 u3 Q) T1 M) E3 i! F; W; z
2 q& Y# X' B. K* m, {    executionCost:"infinite"," O- R+ z2 I* g: {

3 E: Q8 _$ b' _( I; n; ?1 N    totalCost:"infinite"
1 X! l8 ]+ \5 R6 |  u( W& V9 a! c6 e) J" A% r9 d# ?; r
    },7 K- Z& N% }+ n# a9 a% c
# U" ^9 e% k* w7 t4 G# e9 t
    external:{
; I- i# D$ k  b/ B: x0 ^; ]% s
    "delegate(address)":"25000"1 }/ E; F1 B: d" m$ i9 q; v
3 ^5 a# e9 e) h3 n" L3 c3 O( S
    },
3 v/ s& F% O" ?$ J1 K6 M( H& j% r6 _4 m. d
    internal:{
" |  ?& y5 ~9 o6 k' K9 g. w% y) A+ ]5 y  `0 A5 {  @
    "heavyLifting()":"infinite"
4 w5 u5 v" J0 a5 e* M
: v& _: t: I2 G( u/ m3 O    }
9 i9 n& Z; b$ J- P
" D; Y; T; Q8 ]: t' w+ l( i    }
, ]( U* i5 Y7 k2 s# i1 h
( C7 c( f+ {  v: b    },7 Q) d  ]! N, e* }, r. Z
% ^; \# c* R# y1 I* a' t
    //eWASMrelatedoutputs
& z- ]- g4 c% _; o6 G/ [) _) {% q. B5 k
    ewasm:{
: v- j% M2 p$ O# E" W$ S! f2 X' o7 v, |, _
    //S-expressionsformat
: {- v/ y, i8 N# ], L0 {) h# D+ s, e. u. K" H  v
    wast:"",
3 @* u; ]% ]3 R0 I3 W. Q( H" s0 @1 W( x+ n1 h
    //Binaryformat(hexstring)
7 \- q  j$ A6 W" E( I
; M/ g. u( f5 Q/ Q5 o, z' U) A    wasm:""- U' n: ]& N; L3 Q; J9 c

; t! G! e1 [0 B: p: f! H    }/ P+ N: ~9 W6 Q/ m

: u0 s) @4 e) K" F! L$ B& p    }
: m# W0 L0 f/ b" {
6 a- d" B2 ], l+ u( ?    }
4 q* c% V) [/ K) m& z( \; \
: L% M8 F; s/ k  n( d    }5 b' @7 [$ a, J% n

+ j  ~3 h4 j* ]2 H  P" ?9 p    }0 ?5 ~+ h9 N; l3 j) ]( E
" |" }. P" Y0 O, F. j! \
    错误类型说明:1 s6 z( G2 w; G( x. g$ i
* i: f( ]2 T2 b; k
   
: U0 c: C1 o( j! \" u) _1 s" R0 E$ ~) g/ t, O/ r9 b3 M
    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。
5 e9 g& Y- D) Z( L. D2 U/ _; C. T; Q- [% p/ G
    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。0 K" T) C' r' w/ g

+ Q' g6 ^1 u, n    ParserError:语法f分析错误,源代码不符合语言规则。
. Q) E5 ^& N3 p; O5 Z6 j6 f) ]6 X' _# B' H4 z$ [6 B) S
    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。1 V: ?2 o; H% O  J! S
0 l/ y; u5 @, c
    SytRealError:语法错误,如continue在for循环之外使用。. n- U6 e$ k7 A/ J
  \, q' A; s; h2 z  \2 P: f
    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符
- w3 s) q( U$ u/ S) i  y! d6 g. R* U* f9 B3 ?" d
    TypeError:类型错误,如无效类型转换、无效赋值等。9 }# i8 k9 [5 D5 c& P+ Q% j/ N  o
& @* e" R6 i  U0 ^; R9 B
    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。
, [2 _, ~8 p0 u# f* }( P4 R/ O, N# T8 v/ g# g, I1 I$ x/ J' }/ T/ F
    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。
, {9 y7 T( c1 u. ]. a5 _) _5 S8 I5 j. g. N/ @; g$ s
    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。. Z  q) ?( D4 _

9 j, H" j% O+ c' {; _+ i    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。) y8 m# l3 n5 C# ~4 j/ J+ p
2 d4 e. U2 Y' F+ R
    FatalError:致命错误,这应该作为一个问题来反馈。0 ^4 E( p3 r6 j) n
8 a9 s3 O5 D, q& b
    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。* Q: |$ }! [3 w$ ~, t7 S* o+ ^

  T0 L4 J/ I/ C( A8 k4 _8 h    . `2 f5 s1 L' i. q; u: y
5 e' d: ?% w8 O  q6 |0 A; L
    原文请访问:solc
' m( @9 \- e; ]  _, N2 l4 O% {; D0 t
    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:5 T4 Z7 b" `# @: Y0 k

1 q1 _% ]; Q8 K# y; q' ^    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。$ D$ n3 p9 s) d- L: r* v

. g% V. Y& C8 `; m" ]+ s    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

曲水流觞113 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4