Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
solc:solidity的编译器
7 x, E9 m3 t6 L- Q5 {) }7 x
$ G1 n5 R  @0 r3 _. |) B0 _. N) T    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。
; V7 f$ Y# w3 \! e, r  D  |! R# \' E  U, f' o
    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。* P. u5 T2 q, t- \) Q
* y' a% K1 k% B+ U
    solc的安装很简单:0 v! E% x6 i3 t$ ^; Q
$ C  e, G* w# i+ }5 _" }) {
    npminstall-gsolc
/ N  }; S( k1 e) M$ K" `) w. _. {) n7 E1 j) D3 {
    //或者7 [, }5 ?$ T( I
! g9 t6 _6 f3 w: K' ?
    npminstall-gsolc-cli# v% O, q6 ]6 M' @; }& S

/ w7 I/ k# E- \. p* y6 D% O9 @9 P5 Y    //或者7 D9 I! s5 U9 g6 c9 a
4 f0 i' H  J& U: W
    sudoapt-getinstallsolc; O6 L- X! [) g# e& z- S

1 e& b$ d! L; \5 m5 V    安装完成后我们来看,solc--help,solc--help命令显示所有的solc命令选项。编译器可以生成各种输出,比如最终的二进制合约文件、语法树的汇编或者需要预计的要花费的gas等。solc--binsourceFile.sol,可以编译后输出一个名为sourceFile.sol的智能合约文件。如果你想从solc获得更丰富的一些输出变量,你可以使用solc-ooutputDirectory--bin--ast--asmsourceFile.sol。  K# N4 L/ |# T; J

0 G4 g) L! `4 i& B    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。
% R& }8 ?6 L* Q; h1 J9 t' a9 e8 g1 r$ S. q: }# c% Y1 x/ l
    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:& z: n- c0 @" S* p7 O9 o

- }# c3 E* m  `5 K# \' a. {- z: j6 V    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol
3 z. E' s$ }% F; \! t
- V# y8 a0 s% o* c- b    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。0 Z* L( [% |+ t( L/ B
; b- q- s+ r/ j2 [* H' g7 S; l
    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。+ V2 e) n/ t7 C; o' `

3 `) }  S/ v& c6 Z    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。7 Z) L. h2 W; t- G. Q, l

* l) w8 _" r" v+ m8 S    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。7 t( q( m9 i: u- K8 _) o0 B1 G
- m; a6 t' ?: u- q8 I6 r
    如果用选项--link调用Solc,则所有输入文件都被解释为未链接的二进制文件(HEX编码),在上面给出的__LibraryName____格式中,将其链接到适当地址(如果从stdin读取输入,则将其写入stdout)。在这种情况下,除了库外,所有选项都被忽略(包括-o)。/ f# _/ U/ W1 h9 W& O  I

/ j; ]+ I1 v, U* j/ j    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。
% Z7 A7 ?! {  ~/ }2 @4 Q: R( E6 O
) F8 J( ]7 R# n2 s    #solc编译器输入输出JSON描述2 ?( |2 f7 J7 M. g2 q# [' T" E& I

9 S, C8 ^* D9 w    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。
% r1 ^) p* i. m; K& I
% U- T6 m9 @* i( d9 X' w4 K    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。  s1 A. O0 J7 G; J% M2 n: a3 t2 [$ M
. g5 \. A$ H' i! Z- r
    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。
" f) ]3 I% D* B' I. n8 H- R1 I$ t4 `' M, Q& g4 I. O# @
    输入格式说明:
# ^3 Q  J" O3 A9 R' x$ J+ w5 D" G2 U3 R2 @1 c
    {
( Y% _% S  L; U$ ~5 ?9 l/ S+ e* g6 s# H6 A9 \
    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.
$ U$ u+ `* {$ P" t- W% d$ B; R* L6 S2 H
    language:"Solidity",
" y% M5 E3 S, ^- t3 t3 z- r5 E/ z, @
    //Required! U$ a5 U+ E( }1 O+ D' d: _
5 ~- ]: b1 @0 H0 u$ A
    sources:) l3 C* M" K' f7 [4 g( ]
- n  v! N* l3 E: H. m5 ^8 P9 S' W
    {, F6 L" o! s) f  E. p3 {
2 W* M8 c9 p$ d8 V
    //Thekeysherearethe"global"namesofthesourcefiles,
5 s5 g1 Y' \" d4 g
" M$ z# G0 l3 b) T, N  Q8 V3 e    //importscanuseotherfilesviaremappings(seebelow).! B$ ^$ R# _8 z- b# @

2 F! C' M6 n9 M* Y& R    "myFile.sol":2 Q8 P$ Y: f1 Q" g. `0 Y
: I; H  n+ F9 t# v" p# u; `
    {
% m- b# M1 t! t' j8 }, e! i0 ]3 s2 E
    //Optional:keccak256hashofthesourcefile
* L6 Z9 n' Y7 w, N- n
2 X% A) R$ F' S. {. F7 B    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.7 g% [& N8 T& i- i( T, \

' m6 |9 d8 {& F: {, N    "keccak256":"0x123...",; R& A, e  C9 |8 N& `& `4 H
" F2 k% N3 a; O% t( s
    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.6 v1 ^  z+ j- `  c3 v

6 G" c1 y0 D: m8 t    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe9 M; @' |! D! W$ S' _. n& Z& V

" t" _& i0 C* |3 S1 B1 z& g7 k    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe3 w. e; D8 r# R
" ~" Y7 w* U% X% t- P
    //URL(s)resultinsuccess,anerrorshouldberaised.* ^. o4 @( e9 C( E

6 @" |2 G1 g" V    "urls":# }/ j/ f7 r$ y$ H

$ v" q5 [1 @. U) h    [! ?% k' _- V% a. A
/ j7 d; z* t( g$ b0 V
    "bzzr://56ab...",9 k/ h# f" t% \3 K8 c" U6 a' F

- w1 \/ K: h. d, J* m    "ipfs://Qma...",, C! H+ t* @0 Y* j% c' u

& ]. x  G% v1 E" C* b    "file:///tmp/path/to/file.sol"
9 w! N4 S/ Z, @. }* ]' t
; ?' n3 a- W2 |$ b) @7 w3 \    ]& l# U* U; C# m: X
- n2 O6 n8 f, w) V$ Q: y
    },
4 L- Z1 Q. g( G+ d9 B, t0 y8 o% Y7 J" u8 x
    "mortal":
: G) G0 g# P( D9 X
2 v+ ~  o; `! A$ J7 O( H4 K    {
* w" E6 u) ?' F0 T- x: F" v7 f
* e  G" U5 k) o# _2 r    //Optional:keccak256hashofthesourcefile* r7 f7 C: Y( g

+ e5 e0 Q* ]. p& s& [+ _    "keccak256":"0x234...",
% t$ r6 s; K  P6 B) t# T6 r! A
$ I$ x/ b1 {1 B6 X    //Required(unless"urls"isused):literalcontentsofthesourcefile
# p( A5 ?- f! D. a* n. w
0 D& p* Z$ ^3 _0 `( I/ a    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"
. O9 J7 o% ]3 h6 o; c
( S# S: D' ?  ~: Q% a. Y' e: E1 h0 V    }, @# m* y4 H4 x0 G- x
# R  ]; Y. q) W, E) k
    },
; b; D8 k& t& j; V1 f- J! F5 Z4 X, S% q) p  o% K2 M
    //Optional
) X* \* a; W+ a; z: ]
$ J% U4 b& ]8 d* z    settings:
$ ~* M1 R1 H( u; ^4 n2 \( n6 c& c
; U% t7 [* @- Q# j+ n    {
% j; C* D# [; H9 j- j! r) L5 s# K: V4 w6 ~6 ]/ ~
    //Optional:Sortedlistofremappings% D0 u5 m5 B# Y$ x
/ ^3 @  G( l- x: H2 T6 [4 U1 X
    remappings:[":g/dir"],
8 p2 h$ G* q* H; W
, ^, O3 [  [! P) n  z    //Optional:Optimizersettings  ~2 S" y) v& f& b3 \$ e. b4 P/ e

8 X( O# Q0 }( w1 G    optimizer:{
! l6 c6 p( l- y/ W  h# f& ]* A4 K  ]- ^4 ^" C3 U
    //disabledbydefault
$ ], W0 j8 P* o: x3 M* @
( p" r$ z0 z$ U    enabled:true,# i1 k0 Q7 {  z& _6 C! J
, p% y7 r- w; [2 O2 b: I
    //Optimizeforhowmanytimesyouintendtorunthecode.
, B- T9 l  ]' D7 \$ L
  Q, s: M+ S( _2 l8 x3 S    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.
& X5 B  P  q, N2 {' X3 C, S" F2 k  }% G! v) d" \4 ^
    runs:2008 {. A! A* R# Q7 F6 J  j

( [! x+ f, L5 O2 L# Y! B    },
+ V% ]8 Z$ v; K8 p
" s& x! U  ~" {    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople
6 H; u* I1 @0 C) u  d4 R) _5 N
/ |) ^- V9 j; o: T8 X; Z    //Metadatasettings(optional)4 a" t+ W- s3 U! N9 n
+ U! x! P! A* }  |1 a
    metadata:{
5 j/ }, V# {  b, U# b9 k" v( }5 y4 L6 q5 g- q$ i- g* Z6 N
    //UseonlyliteralcontentandnotURLs(falsebydefault)* A1 e! X  U- J1 P

: z0 I" B5 U3 Z    useLiteralContent:true
1 w( `: p$ s3 @* V
& p. w) j6 M2 \* \4 ^& y    },
% c- j3 [  ^1 X) h8 W/ k2 f# n1 ^4 F/ l4 V
    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.
4 I# b+ G5 x1 V3 }8 }
9 C3 @5 W. V; @# X* c% e9 V    libraries:{# |. u1 {0 Z7 d$ n9 i

4 m+ V  W- o, z$ p    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.
' \9 I( C$ T$ x; _
( N7 e) t, m3 e1 F# f    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied.
% O4 X' ~: I7 O* S* Z, A
$ ?! `. G* Y& P. n$ x    //Ifthiskeyisanemptystring,thatreferstoagloballevel.
6 N$ o0 D0 k3 c/ r1 A7 |) Y
1 n6 P& `: F0 D* a9 ?: A- ]* h    "myFile.sol":{8 T3 p+ ~7 e& i0 K
! ^1 W6 o5 e5 @) i5 s
    "MyLib":"0x123123..."/ l. L. Z# D& c. z6 c

" D: N( i3 D  j    }
4 N1 [. M/ S# L* d1 r4 K6 u: P( S! `( O7 z$ `
    }! E- w- h- g* c
& c7 ]0 s1 q8 {! B2 K
    //Thefollowingcanbeusedtoselectdesiredoutputs.
9 f! ^$ b% G8 r/ G! e+ z+ y& o9 [" R* O% E
    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.6 e; o7 B" H4 q: d7 o- b
6 x2 a+ A* H; U. F% x: b
    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,# K4 Q! x4 c! a0 E
& Q6 i& S2 N( @3 }9 V* T* L& ~
    //whilethestarreferstoallofthecontracts.) |) A( _  L5 c6 I$ ^; w$ R. [6 D
5 T' w6 U: \8 D# Y% C+ ]
    //
; ?3 [: z5 b) w: }1 v# u5 L0 L& G- w  F& x
    //Theavailableoutputtypesareasfollows:* }) `4 B% s# X1 S0 t

, D6 H* U# U4 q& |: y5 N$ i. m) ]    //abi-ABI
9 x$ V: G7 D2 g, ^: F/ {
1 P& t5 M0 t! e/ s2 \% A    //ast-ASTofallsourcefiles
/ r4 a$ r# T& q3 c. j! c8 _- _
' e) t, b) C! ~0 e    //legacyAST-legacyASTofallsourcefiles
' N) Q- ?' W% J5 V2 P" ~
5 E. Q5 h: K! V& E: }) p    //devdoc-Developerdocumentation(natspec)' k" [4 }/ l! i# C' g
5 ^' r1 S/ c+ ~
    //userdoc-Userdocumentation(natspec)* t9 `- D# A: S1 Z, r2 W! d; p% H

5 ?/ I- x) h- s% f    //metadata-Metadata
$ [" z! H+ B- b/ h) r6 G% E+ n6 |' u! @; W
    //ir-Newassemblyformatbeforedesugaring  B1 ~/ s& i6 s1 G/ `* t
' v3 x; l$ Y  h5 a+ m* i
    //evm.assembly-Newassemblyformatafterdesugaring
, E1 m. y9 M3 E) E* {6 p
' n8 u3 |" @' A2 `    //evm.legacyAssembly-Old-styleassemblyformatinJSON3 g7 y. j- ?2 _+ O. ^; f

. g. W) @5 M. r) j" ?! J    //evm.bytecode.object-Bytecodeobject' o6 z8 b  [, }
+ t8 o5 k; E7 d3 a! m
    //evm.bytecode.opcodes-Opcodeslist+ T2 k4 ]; o/ P1 j! q

" X- N1 s1 |0 t& ^! g    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)- t, M  f/ M# C7 R  r# L  |
+ q. M; d* {# M9 o& S
    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)
: d" v' O$ y% ^. l
0 \: R' e; O/ o  A    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)+ v2 }% B) G7 D4 x; |
* A; p+ S: Y7 w3 Y
    //evm.methodIdentifiers-Thelistoffunctionhashes- Q# A5 N( [- u8 J4 T2 G

6 s6 Q7 B' X3 D; c' Q) D$ G    //evm.gasEstimates-Functiongasestimates
5 }' o6 @6 |- c  g" J7 `( W
& k9 m- E$ k: f4 b$ i+ Y& J: I    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm)
! j. p! I( k3 a- U3 [5 d8 y; g7 a6 X; h0 E. x' m( T5 H
    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)9 T2 U( C% a* _+ f
8 y6 {9 t* J( C& Y  S" C
    //
$ D4 f/ Z3 t& d2 w% T  o3 D$ {+ [8 F! _
    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery
7 |7 {' U/ }5 k) I8 V6 X* O. d, E
$ v" M( q9 E% S8 R    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything.  W& D$ i4 c# d5 b  L9 @! S
  K- q( O3 j. D7 H
    //
  d% g8 q0 z$ i. F5 L" I% S5 n4 v4 F; d# t/ S
    outputSelection:{
0 ~9 j" e; G0 Q! _; p( X; a2 ^# k- x9 r% B
    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.0 s1 V5 m' U# U* w+ `( z. p

/ I! c+ ]  o! S  V/ S% U& O2 `    "*":{
: D% X/ s! a3 g* i% I2 Y/ N- r$ n. s1 h0 n) m
    "*":["metadata","evm.bytecode"]
# x) p. u! b4 R# _6 E/ n, S: P; D; C  B- [
    },
- [! @5 x( y6 t8 }3 N
. J8 t8 L( w; j" x* L    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.3 w% R, a3 N0 M6 @/ w: `! s

- Q* c1 S3 w# g4 u, E    "def":{+ C7 j6 a$ S1 N3 H+ c" S
: m) F# Q/ J- u1 b) s  q
    "MyContract":["abi","evm.bytecode.opcodes"]8 l) Z  G0 G8 u

  D6 X' h9 K$ B" T+ b    },+ ~! Q0 I  ]) p/ ~- u' w' O; B

5 V/ M; Y! i2 a# a/ {    //Enablethesourcemapoutputofeverysinglecontract.
0 P# Z& s8 u0 S4 `% \
$ `6 [6 Y2 p9 {( P    "*":{
9 N! c, F( Z2 M; C1 u6 S; [" L, C+ A* Y$ o
    "*":["evm.bytecode.sourceMap"]3 C' _* S3 l% R) |
' X& Y- N9 i6 D' Q& o
    },  w9 H6 t3 H. H3 l
, r$ d: `. S# J* E0 _
    //EnablethelegacyASToutputofeverysinglefile.
( i/ |* U2 q# T. x/ W1 S8 ~/ Z+ d- P* \) j1 `
    "*":{
4 V8 P1 ~: B0 }/ |3 R+ w. A- e4 H1 e+ X% D, x: h* Y6 [. @
    "":["legacyAST"]  r$ s/ a! t6 L$ H

/ c) R5 Y% a( t3 E1 }$ _4 ?# e    }
: h# Y+ v( v% g! ^+ J4 G7 Z. p5 z+ O' V; y0 Y+ h. T
    }  @( v. _7 `1 E5 ^1 g# F8 j+ @5 L' p

0 l3 o8 @; `9 ]9 N( g- J    }* K8 N. i* n; G& j/ n

, N& }" n$ E6 v+ a- |    }# ~0 t) v! b: X0 i% f3 P" O9 R
2 \. w8 A7 ~6 [  W8 d6 P
    输出格式说明
4 R- n1 I, N, J! o  F4 k% [1 i) e! r- ?& S
    {
5 U/ J8 [5 @  u! E
" O7 p* L# t- K, b/ e    //Optional:notpresentifnoerrors/warningswereencountered$ ?' f; l4 e. A! f

. S& @; Z  `$ q6 k    errors:[
2 K$ j6 X. v& Y& T3 k
$ K$ I' t+ {# s* |; L    {
5 t# U: ^; C+ N# Y& |' o  q! G9 x$ g# j3 K6 O/ Q# W, {
    //Optional:Locationwithinthesourcefile.
3 D4 A) r/ L; A# O8 Z) |4 g! ?( {
: ?, {& x% W* X* n1 j    sourceLocation:{1 {$ d/ k' x' b+ Q  J- Q# K
3 u" }; l# e) b* n- O3 ?
    file:"sourceFile.sol",
$ j/ v+ M  F' d* A0 I6 q, \# k8 V! z. Z0 R5 N: W- D
    start:0,7 H% G: X. c; R/ _! y( W
9 L: T0 h! ]5 v( d  F
    end:100% v. t1 o. R2 u8 T

8 }" K% l7 }' }8 P2 h+ L    ],
# |2 o5 d: l; n4 Q1 ^! I2 A3 _% t
9 x+ s: m3 S; Z: {, `5 ?# @8 Q9 r    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.
# _+ j9 t2 M5 ^2 s+ |6 [
  e" V% e# s5 h5 s* L+ I    //Seebelowforcompletelistoftypes.! N* b! O0 Q. ?: C7 b/ F" N( m- |
$ K! `/ [% t) @+ d& D, o+ n
    type:"TypeError",6 D* Y0 }( ]2 N" Y# b8 Q
0 L, u! _4 c( i! G4 F+ f
    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.2 O0 r: u$ J- [4 K; `) g7 Y/ L

# l( y" T% [8 t5 V8 D+ e% P; x    component:"general",$ \" d& d! H( Q) `( G- d: ?
+ N" v1 L  B: R) c  ^
    //Mandatory("error"or"warning")
! j" V& n1 H  X1 m* X* y; Z) B0 ^" u* s6 U& q: c+ u! e
    severity:"error",  ~/ e/ x3 o0 M

, N' X( x9 g+ y, [+ S) F0 x3 t- c' |    //Mandatory8 W* k6 d' S  Q
: t7 _& E- s5 @2 U6 }9 N+ S
    message:"Invalidkeyword"
. p  X+ s; j( f% x9 S$ V
$ a* d) D  D/ d3 q* a; J0 g    //Optional:themessageformattedwithsourcelocation
0 A% `( _0 v: A9 w' {% _7 J5 A
" W/ m5 f' v$ P; P* i" k    formattedMessage:"sourceFile.sol:100:Invalidkeyword"
0 t7 J" o" z$ [4 s1 F; Z- T
$ J  {) D) x5 n    }* Y+ {/ u/ g# ^
) v0 z8 G1 @8 t* R. _
    ],
  a( ?2 ^4 n' R' S- j; ]; h2 ~& r8 R1 G
    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings., u9 Q# I2 w- p! m3 i4 x

( B$ E* m  S: l2 R- u6 z  F9 R    sources:{
( N% p8 ^" u. W0 i& ~
. m+ |/ x9 l' A    "sourceFile.sol":{
/ P' }$ Q- i  _! f7 f& V' a8 O; W- z1 |2 ?
    //Identifier(usedinsourcemaps)
9 p2 x+ s4 o, o2 _1 B" l
+ e" j! J& A+ B    id:1,
' q+ p! T$ R# c; @. u2 @7 \" v% S: u9 ^1 s2 @0 V3 C* a; X! H" N
    //TheASTobject
8 e; C5 o7 K. ~! D% I. O, X
; p. y1 _0 i6 J' _    ast:{},
1 R6 L- h5 \" H% F$ J- E7 h
' r! v+ \% d! m! i6 C    //ThelegacyASTobject( L( d. O- f! B4 q% N5 M/ V
5 [& W" n! C% I( T/ C. p/ R! @
    legacyAST:{}6 [4 j" d6 \8 s% v3 @) L; L
; U( P9 ], O' h- E* \' \
    }
- K( j1 d1 Y- w2 J
6 ?. j! _1 ?. l  z2 V+ f! H9 R    },. B7 W( h' E- P" E7 N# g. t
6 `/ E. q# u# ~' o
    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.0 ]: T8 C- U; [2 b) Y" ^8 q6 |1 X

  T- o+ s" U0 x: Y# @1 _7 U+ e    contracts:{. a* o5 @; {7 g# P% U. Z$ p

2 z5 m/ z3 {& f- ^: u( [3 m    "sourceFile.sol":{
4 j% y$ i& h+ R3 k& V! _( u* u; e6 {! ^  E7 L; A/ r* j
    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring.
' s" D" v- \4 Q5 `+ z4 l5 p" z+ m9 T
/ U& r, g! {/ d& T, J% `    "ContractName":{- @! I0 ]9 M3 Y& I2 Y' e
5 ~0 b8 G4 J  g; u6 I) D
    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.+ C/ o4 P* U3 z6 x( K
) W4 N9 n# s) h/ T2 E2 f
    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI
$ T7 O, v/ y4 p- U# s
3 r$ K9 A8 ~5 z8 P$ h( J6 n    abi:[],  @4 M& @5 a( j3 r

6 q" {: V4 h2 E( b  \7 S  w/ W    //SeetheMetadataOutputdocumentation(serialisedJSONstring)6 N' V' M$ x2 w1 C0 X6 `7 N5 H) Q" A1 @5 N

- P: x) i- `6 J5 y    metadata:"{...}",
7 c2 s9 [8 \+ H2 e( b
% e5 x! o" h, p; h) G# X    //Userdocumentation(natspec), R4 p' ~! t6 j# ?! V( I- O7 D

: a! I! S& H! k2 T0 u% C    userdoc:{},8 r& o; V9 W' \; R
& u; \, Y7 R3 z
    //Developerdocumentation(natspec)
% F1 s4 y5 f% D! y8 P" A$ W0 E$ Y: N" A7 @8 m
    devdoc:{},. [6 @, _( ^+ W. g+ y1 f) k3 E

# o- Z) W/ T" j' o5 [    //Intermediaterepresentation(string)
/ k, C2 p9 Y+ v% S4 m9 @8 \6 O+ _" |% H! w1 D. T
    ir:"",
. e" H+ `+ J4 X5 e" ~1 a* Z3 ^: g: H! m) k! j; L
    //EVM-relatedoutputs( U9 p# f3 p! [2 C" ]

8 h! ?7 Y' D  y1 O, G& M! u8 a$ L    evm:{
  j4 N$ V. a, p+ l5 j: p$ Y3 Z
2 m% w+ |/ _% U& w2 n% K9 I( u/ d5 g5 z    //Assembly(string)) e5 j" _- o( t' G' W! @+ ?; ]5 v
* {0 a* d, V6 L
    assembly:"",
" W1 ]/ ]3 V0 E1 Z- }; ]8 o# H% P1 h
    //Old-styleassembly(object)
- p5 s5 |% e' v1 A+ Z
% [6 `3 X4 f! ]( ~2 n8 u    legacyAssembly:{},
; u8 Y, D' F7 c: Q- |
  K- K9 w' \' W: k- G5 m+ b3 x    //Bytecodeandrelateddetails.: s. d1 t4 R6 X- t( t  f& V9 G+ n6 F
+ R7 S" L$ a7 ^' E9 n  f+ c8 e
    bytecode:{
8 q( Q% b( w8 w9 X  |
4 x, s0 j1 O  L! M0 X4 f    //Thebytecodeasahexstring.
3 p# ]) T+ ]* l' b5 y* v; w# g9 j8 l. s* ^
    object:"00fe",
4 v, q0 Z4 X9 H/ Y; V2 k7 q( A
    //Opcodeslist(string). j3 i: k4 o+ g4 U6 g- q& G! g# n
& j: ?, X# S  ^0 w* Z( w* P
    opcodes:"",
: ]8 J& z1 j' J) h, t* ^  e" m4 `: b' u1 g/ y) A9 D7 W8 p- [
    //Thesourcemappingasastring.Seethesourcemappingdefinition.
/ s% s7 F+ J% e# W3 n
6 ~( n8 t3 Q( @" _) O/ y5 ^0 h9 a    sourceMap:"",: I" B3 L+ d5 c( ]3 G

' O% ^3 S2 H* y    //Ifgiven,thisisanunlinkedobject.
, |2 `( \. n2 c% f1 h9 j' W$ t/ h6 l/ }! j
    linkReferences:{+ B: \* b9 s8 K+ p, o2 i! N
. B  q8 Q( h# {. R' v* z
    "libraryFile.sol":{
1 M2 ]! ?$ M2 c* Y/ X5 `( T, K# c" z' q
    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.
4 B  m  q" E% w% o# _+ d. J+ z; |6 B. v( f- C
    "Library1":[% t# U% t' f5 G9 ]

( @. J/ f$ ^- s    {start:0,length:20},
* J( f' U+ z4 g9 _# V2 n/ V' k- R
    {start:200,length:20}
! T; r1 E( V- `. Y
6 d1 Z. b( {5 W6 Q    ]
  s; a- N: _2 s+ ^1 @1 Z9 I* E: ^1 Y1 p5 X
    }
) D2 {) V% V0 p' \& G
& N5 C2 A( L* u$ S    }
0 j9 u& e. e) e" A6 M3 D$ \4 f: n' l. E) m+ Y6 i/ c- q3 F
    },
1 @) R% R2 X; m/ K0 p0 S1 l+ @/ `) M
    //Thesamelayoutasabove.
5 L4 o0 j' H1 H; U
7 O$ \& U) |. g8 f3 @7 L- w    deployedBytecode:{},
! }5 j* W5 {9 e1 e+ t  d1 Y. q0 V& N& H/ d
    //Thelistoffunctionhashes0 ]1 e6 z& {$ {0 l) D5 B

% G% r0 X6 B% j5 T) {    methodIdentifiers:{
, A2 j$ u1 y. b3 I5 d+ B6 [- v2 Y9 U+ d
    "delegate(address)":"5c19a95c"
# W' l, e  w7 x' }# R) O
. y/ `) u6 `1 {; b/ n    },, t& g4 w$ D* @" ?
. m3 V% \: i$ I$ J4 C
    //Functiongasestimates
: P$ e2 |% K! {1 b' X# p- v
! ?; i* H: r, t! V* z! b! `    gasEstimates:{
4 O* O9 D" o; t9 h4 k( P1 U8 q2 K- t1 T: n7 \$ G
    creation:{3 v" j) q: S" S& V: K4 I+ d& ]/ v

( N$ [) [: r+ j& z8 C, q* x    codeDepositCost:"420000",
* n. _4 X  k3 ~, Y; @8 ?" f  M  @, l: X) a. `) y+ ?4 a0 |( A
    executionCost:"infinite",
: i6 y" p. c6 i
; D4 r. b5 D% T    totalCost:"infinite"+ P! F9 g% s" \, `  C
4 X5 b- I) M* a  P; _. S, X# p7 W% ]
    },
7 c3 x) @7 |. `2 s3 B9 Y0 _
# j% ~; A7 o3 y# a( M9 d    external:{
# ]" B5 e1 i4 \" L6 r3 V
% j8 x+ I$ h, [1 C: E; r    "delegate(address)":"25000"
3 z) ^' w9 v2 L7 ^9 p' |
& S% [" _1 ~: C4 n5 Z% G    },
" h" C1 U- Z- I! r& K7 s, U3 W- O( @! @- m0 u: D0 M
    internal:{
2 i' p+ D. ^6 A/ ^
  D) Y" o7 C- u    "heavyLifting()":"infinite"
; Q$ T1 }5 p5 V; m+ f: }3 C' C3 Z& y* O& `# C% x
    }
, F: T- l" Z" M+ i" a& S/ i9 i! \" u7 S
    }5 K. V/ N5 p) r9 |& ^

3 F; `# i3 `+ @' H6 t  V    },
& F: d! h3 M$ \# ?; n& d+ Q
4 y9 N, Q# j# H- J    //eWASMrelatedoutputs
# W9 J7 N- M. n* L% E
7 u7 Y' H. u" I2 s    ewasm:{- N. K+ i. _: y6 d6 A1 j
- K# X. r' N: {  r
    //S-expressionsformat
. G: v" p! t* f1 I& P( u/ z# G4 A, |3 u
    wast:"",
. G4 M5 ^# G! a6 Y0 e% P- O
. x3 w# n6 Q8 W; \% u    //Binaryformat(hexstring)
* s9 ?; C6 E! c+ E% A
2 k" c) k6 ?/ G: v# O, J* a    wasm:""
' {. a7 S/ u& k# ?, Q
4 D2 g& E/ W. o: E& g    }" j+ G# f, M& ^
" g+ f6 {( k4 M3 [* E' I% b9 K( B
    }3 F& R% f' c& ?3 u8 M3 c

6 }4 b* }- Y6 u& R: G    }
  e/ {2 s( m6 x4 \5 i- r! w9 D6 J4 |4 B1 O5 c
    }2 X# D3 f) b$ \3 h$ p

" @0 F2 W( N+ i" z; d    }4 ^% O& s% g3 @/ }8 k

* Z9 m  H' n4 |; b1 ~, H3 `    错误类型说明:
, u8 z5 E$ _7 w, |2 }. B& R9 ?
1 J1 G# _4 ~9 J# O3 u( v6 Q   
: y0 y/ h8 q* Y* p0 `* n0 A# v8 P, x, x- g
    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。/ I& l7 ?) X5 ^) B* Z0 _' r; P' X, e

; B1 k1 s% I! n1 d) y    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。
! u: O$ ]" P8 ]
7 K7 M/ M# Z9 X+ x& \    ParserError:语法f分析错误,源代码不符合语言规则。0 r4 }( F3 [* U
2 a2 c2 n+ j; O0 E2 A0 u
    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。
- }2 j9 i# U$ F
. J4 e9 B  {; p$ t- Y    SytRealError:语法错误,如continue在for循环之外使用。5 o/ ?- I% a  J
1 f& [6 o  `" x1 |+ w4 G
    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符
& W* ^4 w+ ~+ d# A
" t, c1 {0 m# P1 |* R* X/ o" E) }    TypeError:类型错误,如无效类型转换、无效赋值等。
" F3 w" o2 L3 h" E& Z& a) y( E# u6 q7 w; K) L
    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。. H$ Q4 @7 a; i5 {& A

3 s5 s9 l% Q1 s9 {3 _9 i. G    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。& M- o+ G( T, N) g; i6 A; i1 Z4 V
" H* p) K( T! A% I, M
    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。
- Z  ^! p  o: J4 X
) U) h' q. R7 K: R* r0 l    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。
8 F6 y7 e- q4 {: F  l2 w4 s- u# u% Y. z3 q: M% J
    FatalError:致命错误,这应该作为一个问题来反馈。" F/ k2 v* b% M& X
' P/ [! A2 H9 ^  j: ^1 s: k
    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。( V3 I6 I& e+ w# s3 v+ F1 w3 V$ M5 s

% l# f; h5 s' ]2 t$ z    & C% M$ S" Y$ v+ }

9 b; n, E. U) W3 ~    原文请访问:solc
+ T1 \& l1 _! k7 H* M$ F6 Z: S1 X* S+ n" K" V$ G9 }3 q- P
    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:* Z+ A, i- E- K! W( N0 S

3 i+ U" S5 v& }7 E& J    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。
9 a( L% W( `) f, r3 K7 o( r* Z# ?" B" S! I
    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

曲水流觞113 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4