Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
solc:solidity的编译器) V2 F. {8 u' l5 b7 W6 @

+ V2 H3 Q1 ~2 [6 e0 w# Q  Z+ o    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。( U4 ]$ d9 a0 P6 L8 @
$ {/ [" \3 S, W5 t
    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。
# M' q7 C" u  x; r9 o/ R4 E- Z/ J2 B
    solc的安装很简单:
* p. L; D1 A% }, ~3 _
9 F) D; ]; B' ~    npminstall-gsolc
1 l' K( ^% r0 X8 V. a( S
# n) O" b1 R+ s1 q+ U7 ?    //或者
- @- E) \% q" b( ^/ |- _
1 Q0 z/ ^8 O6 d$ l8 j. e  K    npminstall-gsolc-cli: v* }! `+ t7 o& s0 i

5 l4 L% I/ j+ @6 \: n    //或者
# G6 d  P6 B' C1 r  _6 L# D
( U# q4 V* g4 r& o    sudoapt-getinstallsolc  E; z6 p, \# u3 n1 O" F
. k  S% l' D& p: \- c; I  `
    安装完成后我们来看,solc--help,solc--help命令显示所有的solc命令选项。编译器可以生成各种输出,比如最终的二进制合约文件、语法树的汇编或者需要预计的要花费的gas等。solc--binsourceFile.sol,可以编译后输出一个名为sourceFile.sol的智能合约文件。如果你想从solc获得更丰富的一些输出变量,你可以使用solc-ooutputDirectory--bin--ast--asmsourceFile.sol。
! N$ {. P) R+ k3 J, s8 ?3 w- w7 B& X; D
    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。6 o- j( d' q+ I2 S: v) u
$ {3 x5 h- P9 |: q/ k
    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:' V, K- ?" i; C2 r& Z$ G! D5 n
% U# }3 A7 c$ ?0 a; }) `
    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol
" ^9 X) k* Q+ ]8 X- P1 d( E  Y( N# N, _5 [
    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。( _. C$ G7 O2 U8 v, B( R8 z
( [( Q/ f# Y2 `
    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。$ V6 p) l. q1 ~$ {0 }

: [" s, _- u8 b2 D, o- R    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。. m9 Y" B$ x7 k  \$ O+ G4 X* V" C& \

3 d, Q' d. W; M    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。  ^* p: G! @) \; P
" X8 E+ P5 f. _2 U8 o  K
    如果用选项--link调用Solc,则所有输入文件都被解释为未链接的二进制文件(HEX编码),在上面给出的__LibraryName____格式中,将其链接到适当地址(如果从stdin读取输入,则将其写入stdout)。在这种情况下,除了库外,所有选项都被忽略(包括-o)。) r, h* m. c1 T" d3 G0 |

/ F9 t) F9 E, ]( _    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。: [5 w- G8 ?3 \0 W0 [+ N2 ?

4 i8 {+ H8 ~. Q    #solc编译器输入输出JSON描述1 `( f7 B  U$ ~- z0 R! T
2 l3 t/ O9 P# s
    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。
, i. U1 t: M' u: O+ L: L
% E" r, y' n/ ?2 F    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。% w+ ]  U$ x2 L* Y
+ U1 _# g, Z$ ~. x$ `
    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。" K8 H) Q4 l3 L+ ^
, Y* e( S) \8 D8 {# L$ R
    输入格式说明:. u8 l3 |4 G" N7 s$ D

$ W3 w6 C& f5 i# w0 H    {- e, x3 K; n) |) f
& `# X; v0 h' c0 K: D
    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.
. `- b3 I7 m1 j( [5 z* ]4 l# o$ u# Z2 B( J9 _$ S
    language:"Solidity",9 R) |8 X0 C8 Z  ~( `3 T
( O8 q7 x- o; w0 L, @# x3 U
    //Required2 o- z2 H. o3 y5 i2 x% Z9 J
. B% f; B0 Z/ k6 k
    sources:) g: ]3 k% H+ _  `

2 \  h0 U. P# [. T: m    {' k7 p6 M4 v+ G2 q: g) G# O* w. H

6 f$ K1 C6 x, z: |, m# p    //Thekeysherearethe"global"namesofthesourcefiles,7 @- Z. Y$ P/ X8 [0 K( S. C4 [

9 }3 G9 |5 r) Y( {) P9 V+ H3 |0 {  ^    //importscanuseotherfilesviaremappings(seebelow).
. X- U! ]5 v% U
$ D2 \& }' Q' d: k  ^    "myFile.sol":
2 Y. f# a8 x: C1 G8 R- B
, o3 e6 _# r* M& J- E$ g    {5 b0 o' n5 |, s3 D1 A) k
7 i2 S: h; |6 B+ f" [3 \5 t! x
    //Optional:keccak256hashofthesourcefile( ^' W. r# h6 j1 U
5 v/ Y  d& e9 K$ z
    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.+ Q+ I# m% Z" A% \6 s

6 D8 p* j$ d; y  o    "keccak256":"0x123...",, m, s' A; E3 @- p. ~

: {# U# K2 Q" e    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.
% ?" }+ O$ [" h  e. v- `; f' I2 N7 ^  x. m& F1 g) R& Q! {6 c
    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe! n0 g/ ^4 m& ]5 l/ B2 E# i" n

7 V& f/ y  V2 I! Q/ Z    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe
& q4 {) ]4 b3 O5 W! ^8 n# }, t" y
' F! N$ x* i' l7 Y0 J+ B2 A    //URL(s)resultinsuccess,anerrorshouldberaised.  X0 x, {! _- w" b5 _
( v& q8 c! M2 ?6 \5 _
    "urls":
; C0 x+ W' g( f2 M& \7 G7 |3 k, }, x; d- m7 T% J
    [
8 u8 z+ x, T  S  N9 O. J- M- {/ y/ T' a
    "bzzr://56ab...",* O7 r: a1 d8 Y/ ^2 C
! x; M' L, |% I; H9 t9 L
    "ipfs://Qma...",
2 `6 Z3 _+ H5 s8 T2 K
7 j: w7 I- ^/ ~$ K1 g" R    "file:///tmp/path/to/file.sol"+ l2 X! L5 S" _  `: K6 T" I5 {0 i
& y) r4 `( R# I6 a* P' r
    ]6 _7 h9 x7 t! w8 T

+ a6 X: o8 {8 K2 i6 m    },
7 ^$ j9 y2 q  _5 y  A; A8 @+ [( o2 y8 J& I% k
    "mortal":" V7 d* Q8 L; R1 ~6 o9 K$ A) L7 [, S

6 f; K: }& V/ @) c    {
- x2 F% \7 Z# m7 K" ~5 e; K& X: v, f3 I
    //Optional:keccak256hashofthesourcefile( R& R  l) ]( p2 W, y; n2 k
4 j3 b$ G* N2 b! h
    "keccak256":"0x234...",8 s- z: q: {2 n" x
, R; j9 x2 Y$ ]% L  l
    //Required(unless"urls"isused):literalcontentsofthesourcefile
% B1 @' V- z7 l- \& F3 q' v, b
3 x3 ]# p2 b( R    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"
+ v, l) E; X4 ]1 N  ?+ N- I- p& b: M) G- a$ k8 h
    }% D# q' T; l8 n( ?& \

. H& M. R2 ?$ d( g    },
# L2 u+ M* @9 W, V; N; X: D5 j5 l8 B2 Q
    //Optional
% G  ?6 G  m9 B+ Q2 |- o) \. c7 `$ L7 d* l1 |* y( l
    settings:
, d1 r( V! T! r, l7 S/ v  D; g, d/ z" q5 e8 U" z  Y
    {
6 [7 }- |* s0 p& U- m0 V: ], n+ T% H; l) E) ^- d: ^$ V. g2 X  r
    //Optional:Sortedlistofremappings
- ^. e; Z$ r' e* y) M* j, B
- C( ^% m8 F3 j4 i    remappings:[":g/dir"],( \; E% Y/ V( p1 Z, f
6 C- O( G/ O. P; r  m* z
    //Optional:Optimizersettings" P+ y* s$ P- c

0 x% s0 M$ X. c/ i    optimizer:{
& ]: [6 c- {3 O4 D- Q; C: _7 w3 ^; Z3 g! |, C
    //disabledbydefault' L4 o) r6 @: z6 }) L
9 s2 c  t2 O% i
    enabled:true,
# K/ x1 t. d- W1 x$ |( e
: w$ |2 Z9 c( _) N    //Optimizeforhowmanytimesyouintendtorunthecode.
) P* l, G' H+ A' A
2 L$ W) e9 b1 y6 a    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.
* s) I5 Q9 k+ Z4 e4 i- Q8 m& w0 _' b7 ]; A
    runs:200
3 H/ p% w9 W& Q$ U* x+ r' t+ z+ N- r$ ?$ z
    },: E+ o% A2 I  j" Q" Y* v$ w& l

1 ], j: C9 i/ r& W    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople9 m" C! P& u$ E  V9 c0 F

1 D6 k3 b; T9 W6 i2 ]$ f' N    //Metadatasettings(optional)& _2 D7 b( s4 f* u

! x. B7 W7 l& B5 l/ n6 I3 [1 h    metadata:{
+ F$ \- W5 v0 q0 {, d, R8 V1 ^+ B% D& [- L  P2 S) X% }
    //UseonlyliteralcontentandnotURLs(falsebydefault)$ T. y+ n( f& D  u' Y( |& y" d

% M: K! \& ~8 A$ Q* z. }    useLiteralContent:true
2 W& U4 X1 n8 Q3 h3 U7 ?
* x6 `7 r* X' g( ~1 e1 g" c    },
. ?/ d+ l. E3 I
1 W$ ?: m' R* r! R! S" C& G) b    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.
: O  s7 x% ?  g1 c5 i4 t0 c* x- M4 |+ |( J& k3 Z  O( |
    libraries:{$ m5 W# w, T1 z: l. _! H! s

  X/ c; c& f8 ~    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.  g$ O  f3 E/ v+ K

0 o( f5 s/ {$ z; P$ h/ E2 Y) s    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied.
4 }3 V: k4 `+ r* n# c) T/ Z6 l" t2 R& R$ a
    //Ifthiskeyisanemptystring,thatreferstoagloballevel.
, o8 q' s: f; k& f% b5 b* }( q! b4 P- N. \9 z
    "myFile.sol":{, {, j0 M7 F% y/ ~3 b
0 I4 r9 o6 H/ S9 e1 z
    "MyLib":"0x123123..."% G$ J- E- \% Y- Z4 j3 q+ ^/ o
5 H: X( Q0 S5 y
    }5 E. m5 T3 d" v

3 R! K! b9 O' Z2 O. u8 l: d    }; R1 Z7 a; s+ ?9 D6 k' }# H, T

8 I* {% O4 Y. P$ t8 W) a. h    //Thefollowingcanbeusedtoselectdesiredoutputs.
) q. |: s" o+ v, A, M& z2 V& d# s: |* ^4 I
    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.7 y0 V  e' x. g, i& A# `0 q

, h/ ^  h- S: {4 B) \    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,* |9 }! t' G! Q1 M, B! r( s3 v

# f" i! s: K9 |; L    //whilethestarreferstoallofthecontracts./ ?* }6 j' E7 z9 K1 C
6 V& y9 I7 H* p  [
    //
8 q" v1 K( w1 a% J! s" [, ]" i1 U# C* z
    //Theavailableoutputtypesareasfollows:/ ~0 b: B  P! d  ~

+ y- f1 U4 Y- h% c0 T    //abi-ABI
# s6 v/ o; i( X' D/ B: V
- l- G; j: u- n, ^0 ]    //ast-ASTofallsourcefiles
5 s1 {& s) h: C4 g! n- G- M( A2 v% F8 s- ]1 s& ^" L
    //legacyAST-legacyASTofallsourcefiles/ W. t' p7 C5 ^1 j- T1 \; F
7 J4 r8 @, z/ |$ d7 A6 J) u4 E
    //devdoc-Developerdocumentation(natspec)1 b+ r; c9 |0 Q- D

, H' A3 o& a! N7 l& x! E  B, B    //userdoc-Userdocumentation(natspec)
6 I3 Q8 \; u6 S' g/ ~' k
. z1 S/ Z/ d1 {) ^( ]+ v$ q    //metadata-Metadata
6 D' K1 c/ {% l/ A- t) \" a% ]  q7 I; w
    //ir-Newassemblyformatbeforedesugaring' K. k' i0 F- ~7 V9 w
; C& D" R0 m: d& }% E7 \
    //evm.assembly-Newassemblyformatafterdesugaring% f* ^% Q, D3 \/ i# R* W" w0 ]

, m2 W( c: A0 c9 j6 j! M- W    //evm.legacyAssembly-Old-styleassemblyformatinJSON
  L( _, j3 T# J9 q' O9 y5 K% o; }
6 a: |* w, k: @    //evm.bytecode.object-Bytecodeobject( H+ d" V% R3 d& C  D
0 Y& D6 L1 X" H4 q; y( {* G( t
    //evm.bytecode.opcodes-Opcodeslist
7 r* X( p6 b, M% g2 n+ l, B& x: h: y. |5 ?: ?' S8 w" J
    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)7 i" {* a- c$ y2 I4 B3 m

, c3 t. Z1 Y& k6 N- n  v    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)
1 {5 T: Y! A4 I1 W, s
6 y0 u9 |% H  K, T0 o1 X+ j    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)
) V# k' |9 S( r6 B8 F1 b! ]
( z! c8 ~5 c( I: `# u. U    //evm.methodIdentifiers-Thelistoffunctionhashes2 k: T! o6 r# s* W& ~3 }

% N0 ^# I8 E  w0 I* n    //evm.gasEstimates-Functiongasestimates
& b1 ^, m; L! W6 L( M& k6 F4 o9 {4 J8 q3 W, Y2 v
    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm)
, {  _5 C4 U- T, g% V4 n3 {4 p; P" e3 V( x1 e
    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)7 x# @; [4 G1 }/ J1 @) {$ L) R
* q( f. V5 d/ [$ a" s( c$ m! a
    //
  m5 X9 B6 |+ N: \# u& ~7 r7 [5 S3 B2 j3 M0 A  k6 @
    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery
- I' e( s2 p% _/ o6 ~3 K7 e2 b6 c) A3 G' o& S) [. j7 N8 j" [3 N
    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything./ ]5 u. \7 L% \
, W  [' o! R9 S, s: F3 H& {% ?
    //
8 U8 P: m# L# y6 \, R1 g
  Y9 |1 ^8 Z0 z" p$ A    outputSelection:{# C) B- R: y6 h- K: w" `& a* |
6 c! r; Q# y. L4 h
    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.7 b7 W" V: U3 f5 z

! ]. Z* F/ C7 E5 R# B% G    "*":{: x; W) [$ B3 s7 X

! C" {; C/ h6 I0 |$ i    "*":["metadata","evm.bytecode"]
) V  l, [8 i; |' U# W2 c+ D
7 ?0 e0 H) l# p( U2 ]9 p" u    },
/ F6 @+ _0 w# z4 V1 D7 ~% i/ a* Y
    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.; p! W5 K3 `! z; Q$ K6 m
+ x$ p/ |7 V8 R1 c+ x1 ^" \
    "def":{# x# G4 y1 L# Z

" x# W' x! `  w; T! I7 ]. ~    "MyContract":["abi","evm.bytecode.opcodes"]3 a5 [  h3 l( u3 {8 x; v* v- l
. Y9 j* [2 ~* I3 t  V0 v; ~' w' g* }  P
    },9 f! u/ G# y9 |1 k- y

) Z$ E; y5 t1 y) h    //Enablethesourcemapoutputofeverysinglecontract.
! k, ^; V8 Q& D# y: @
, \; F( w3 s7 D2 z9 N* h0 d! K2 n    "*":{
3 K, y% v3 _# I) }2 L% x' z$ D' S( @$ K+ j0 U  u
    "*":["evm.bytecode.sourceMap"]
; D; h' b& |  b( E' M7 |/ K; K* x+ I! V- H
    },
& C, i1 `1 V' M% N+ p; P) @/ i2 \2 K
$ r7 O8 m" ~' ~$ B: n4 W    //EnablethelegacyASToutputofeverysinglefile.9 B. t! v1 r8 F) Y5 D- ]
' M2 k! s2 k3 h- M( x' G8 w
    "*":{  a; f) U" V# \& s. o9 [
% f& }( f1 }# M. K
    "":["legacyAST"]
: p+ U" t+ l) G9 @# A! j9 e  ^  H, U3 F6 S' _
    }
" u. m7 P* X4 M  x6 C( E+ G/ P( U
    }
) T3 ]. C& [% X; ~' j
  O$ D* i$ ^/ A5 O7 r6 M    }; y) f2 k$ k/ `6 j8 L4 \# H

; p. _& S2 ?/ r6 H+ Q    }
  @' A- C  p& B2 Q) j" ]- n
5 j5 d6 u0 _" a    输出格式说明
- D1 g0 N6 r; s& X
8 _% K( c; H, {7 m" l    {2 A  X- u# C! w* j6 X- \( f

1 ^" ]8 O* s. b9 r    //Optional:notpresentifnoerrors/warningswereencountered( k5 M" Q3 v' d7 }  o
& [, @- F" C1 s8 P2 K
    errors:[
  ~! N2 v( a" ?$ M3 [, {. r$ _5 ?$ W# D2 T
    {
5 M+ X1 ]$ u. z/ {; n4 D0 U; {8 J! t
    //Optional:Locationwithinthesourcefile.
. T# c: j3 N8 I5 o" E  D6 L% M) G: a8 ]) x: Z) \* f
    sourceLocation:{- p: K. C3 t# N8 U5 @6 n7 j

1 i2 |* z* X9 A3 L4 _    file:"sourceFile.sol",
5 g9 m! q$ ?0 f- W: x! ^  F  m9 ], g3 C  r4 K
    start:0,
( G. _1 P3 n* _7 y+ l& @! ~" p; B3 x7 r4 O) `
    end:100
! X, m1 @! ^! A6 {; _9 r" G& I  c, I+ R+ z$ w
    ],
( t8 X- ]* Z, }' y, L) J- F* v" T" w8 r- e
    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.( {  J3 x0 |, M

  y; o! a. j% p! Z# w1 U% ]8 Y    //Seebelowforcompletelistoftypes.! G: b5 w+ d( U) a" _* R5 @6 K

$ _% {# W' b: E    type:"TypeError",
6 X0 H6 t* S2 |
7 z5 o0 @5 r) R1 e% G7 A    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.* G4 Z7 p5 y% U8 E$ z' ]! r4 Y
6 l, l0 T7 P7 @, z+ I( d
    component:"general",
% T3 q( C  `4 h& ^$ b+ O' Y! _7 b! i
    //Mandatory("error"or"warning")
0 M9 p) k7 ^0 M! _0 q
+ E" o9 w- W6 G- k9 z    severity:"error",
  z1 n" A0 s% |/ D% R" z  I/ g9 r0 n; I; \6 ?- E6 M- f
    //Mandatory* j5 n/ E: v$ V4 T7 @1 F* e
- i9 r- B7 q8 g
    message:"Invalidkeyword"
6 n2 I8 g. l5 j: @8 m# [& g) i2 T; J( K* M
    //Optional:themessageformattedwithsourcelocation
/ C: i; q) Q# a8 a$ j. q0 W6 W- f
8 S6 V( p& K% o6 M% R* C" s* e    formattedMessage:"sourceFile.sol:100:Invalidkeyword"
" q. ?; S# S9 O0 E$ O) \1 z
1 k# C$ Z6 w+ Z' L& j5 D    }$ V) C2 }7 K, s( v9 m
0 d% w: \, V" ^
    ],3 E. P1 k8 U: p& t9 [$ C

0 N" k/ O" x% m2 ?: q    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings.6 Y$ ~6 v2 E; t* w$ J) S8 D8 k

. x5 w7 |8 G: V* A    sources:{
: [" N% Q7 S$ \- D8 p; K, V
! x* ?! w- _+ X+ e' \1 i    "sourceFile.sol":{2 i) C8 C% h! t2 O

0 ~) @) {2 J' b5 J    //Identifier(usedinsourcemaps); _4 x% F; t6 \8 K  d, i

2 _+ Z4 @# d, J! G: [# r    id:1,, d2 a4 i; I2 C" b3 u, g; r
8 I  w5 ]3 ]9 \/ H' G1 @) a
    //TheASTobject: D/ `2 G  Z) E& I2 N. F9 B
  @6 Y2 P! x0 E& e: o1 Q
    ast:{},1 ^. i! L. }* m9 ^/ c9 b( S
; r4 r, }9 @% x, j: W, U4 I/ a; G
    //ThelegacyASTobject* Q3 a9 ]* b) ^

$ M; w  D2 X+ ~' }4 ~2 m! ?9 g    legacyAST:{}
; Y: z; h) c$ D* t
  b0 S  p% z  H    }
4 G2 x+ t) k* a: ~% ^$ O! |( ?: H" a* x
    },
9 B! o2 y% [" R2 a4 L0 B' }
* o) }: s: p8 l    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.9 e( O' F3 p4 R2 A/ h1 F/ V

- `+ _. w1 c  H- ]6 b: N+ L, G    contracts:{6 W$ L" B( v6 J* ?& m  ]

6 x. u1 C% g7 K% g+ Q    "sourceFile.sol":{; j' \8 I1 g. k* Z
( e" y6 l( `  [( o- ]3 e2 [  g. G
    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring.5 |, w, S3 V+ r! h4 ~) l' H$ a2 C

& |" J: P% X4 d# t' ~    "ContractName":{
; d; A' D. J. U6 y7 K
& g  q, u& ~! V8 d: K    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.) p- ]- [/ X' m7 c

, B: x  A. J' N! ^. B# _; `    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI5 n+ _2 T/ d# J

" x6 u3 X2 [& ?+ u    abi:[],6 W$ R2 w2 J( V! x6 m# @

" T2 |/ C+ u: Q, K    //SeetheMetadataOutputdocumentation(serialisedJSONstring)
, M! a! e) y1 [$ e1 b! k
% ^6 e1 I4 w7 ^/ R" J; A    metadata:"{...}",
/ o- F4 [* J; [( N. h
- I6 i+ a4 {) d3 F5 L9 @    //Userdocumentation(natspec)$ m( n7 y  T% g! F9 T5 M

5 v. a& L9 Y0 |) h% r3 d5 w  C3 P    userdoc:{},+ {/ d3 ~: g9 Y8 k
$ L% [: U* n: b3 L: ]
    //Developerdocumentation(natspec)# I! v  X: h& x. ~/ U
9 D7 N5 v% @0 d+ T' b' Q
    devdoc:{},: F! N& z  `& A$ l2 `. T# l
1 u5 r9 ?& L( E9 A- X
    //Intermediaterepresentation(string)
, e: K. ^+ Z" L" G( r9 p8 j* c
$ ^, l1 Y+ f( ~/ u: t    ir:"",1 R- D( {+ o* b* b3 g+ c
% K# s. }, C) S, \
    //EVM-relatedoutputs
. `8 W8 ~( q  g- {; D% [
/ U% ?$ @! x4 b: h/ c    evm:{
7 R! o$ D6 U5 y. |! g7 b; ^' K2 i) D6 s+ t9 r+ l* r
    //Assembly(string)
: @- X6 j$ o. r! L6 Z# ?- q/ C, f7 l7 }' d7 E
    assembly:"",, `4 j8 L7 m' t

" o+ q% R+ z/ n    //Old-styleassembly(object)) f+ N$ _: D9 c. R3 D* R# O
1 S! A' x" ~+ k. j7 r6 G2 t
    legacyAssembly:{},$ Q, e6 n2 y/ F" Z
5 ~1 M4 V0 R9 g3 [" N
    //Bytecodeandrelateddetails.4 M0 C$ U( `* j5 h$ ~! ~
) U% @2 p- Q, A  W% f! N, M
    bytecode:{+ y# U$ q0 C5 q6 Z! a( o9 N6 i
7 o) I3 {4 H. i! |, j  w
    //Thebytecodeasahexstring.9 k2 W* A9 T: C' ^+ U
3 P3 ~& n) f! K( F# ~2 n( l' e. i
    object:"00fe",, F) ~5 \+ `' ^/ j  \2 J5 b

9 c! V( y4 g+ }1 z4 P    //Opcodeslist(string)
, q8 H8 O  B4 x) L9 A( H: @* E& K8 v. Z) `3 I
    opcodes:"",/ h& D" I. p. e4 h( N4 r

/ O* ]1 Q! s6 E2 O% Z' Z6 S  q1 A    //Thesourcemappingasastring.Seethesourcemappingdefinition.% x% h5 m& ^1 g  _/ r0 e7 K
3 ~9 {$ A) J* h8 ^, f- J
    sourceMap:"",
$ W/ V: z( F6 E# c" O4 e3 Q* K& V* i  m
    //Ifgiven,thisisanunlinkedobject.
; c. L# S8 {* e- ]: X; S3 V) d: v- u' x0 R& v! j
    linkReferences:{
$ o2 D9 ~8 [$ H
& q+ y% E( f# |+ u- m. Y    "libraryFile.sol":{5 n( F4 C: o  r" ]. N
( Y# g# D* @8 h$ D4 X
    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.
9 ~) x3 J9 w0 g+ Y
6 B2 K6 z1 F; O. n! n* }    "Library1":[( |' X( m7 L- P; }5 C9 v

' ]& Q! [8 x$ e4 ~$ S    {start:0,length:20},/ w8 ~# O% p/ G7 m0 g; E7 j. q  C/ j
0 L3 I9 m& C8 ?2 k/ n0 p* S
    {start:200,length:20}8 t! _& ]  `" }6 E' n1 F
  |  w; O4 E2 y$ Q/ m
    ]/ }4 F# ]- B! P. g: a/ P  K3 U8 E
# J$ W" ]4 }; }4 E2 ]
    }6 k0 n- R6 N4 J- m$ d% l
7 I' L7 `9 m0 \' Z- x' B8 w
    }) n# V7 K6 ~3 S! ]# j
4 C) l0 w! A( ?1 o3 r. b
    },
* L# V# \2 v2 D# H: X: I% t) \$ T- c) R5 }6 v  `/ c
    //Thesamelayoutasabove.
* I, W; @: |( c. t' S  }$ G& l1 o; F
    deployedBytecode:{},
* t8 w+ z7 u5 t2 @5 V; t
0 G" X6 R, {9 g4 D6 q& e, q    //Thelistoffunctionhashes$ X* [: x6 j9 H& l' k' ^$ P
: [2 {6 {% y9 d
    methodIdentifiers:{
: c7 E  f! j4 v" o. U; [2 S
/ z. x2 G# v" O. k    "delegate(address)":"5c19a95c"
$ l, `/ _. ^8 ]# g% x: ^
% ~' \3 }' p; F5 V    }," K* o( G6 @1 M- d
) y' c6 l. x, A4 P2 b& w
    //Functiongasestimates3 Q: _/ a, M3 e# ^% h: |
7 d9 j7 U; q, V; e% I8 y6 |
    gasEstimates:{. L3 q5 U) a; u" K$ P. Z

8 x, l9 P: r3 j! s( Y    creation:{$ W* S9 _  G! w* r) E6 g3 e6 I
8 _. I) h! k& U7 W( ?! p, S7 f: ^
    codeDepositCost:"420000",/ z$ x& |1 @' j- @- b; h5 Z

, X7 V8 U8 V9 m" L0 R4 v% [' M+ t    executionCost:"infinite",( f0 @6 e( V& s# ?3 O& g, {+ X, H

) h' |  ~- v" q) `    totalCost:"infinite"; E( ~: C- ?# [+ O2 F! H0 H
) J% z, R& G# |2 {' l' d
    },+ ?; |4 S& E7 e5 n2 M8 J& w

3 }; ]( N- U8 v' p! @    external:{" `/ d2 Y% u6 J

4 [- p$ d1 D! o    "delegate(address)":"25000"
: m0 N6 {9 ~9 J& V& N& C( T/ d: J: q2 H5 f
    },
, g+ Z6 ?/ K& t) c
; b; g5 d5 G/ s& j8 D    internal:{' _/ [; }( l' I8 s$ U

# D4 W" p6 }3 D6 s    "heavyLifting()":"infinite"
) R0 \6 m$ m" u9 ~
2 x7 b/ c6 k/ N; H$ \% r' ?! x    }
, b0 {2 M% }: }# j3 M
9 Z( a$ C( B3 I$ z& L    }
# W7 I; L5 `) \$ ~, [
) T# s- K  u3 B5 Q1 w* J; {3 G6 Z    },
8 |, w7 J& d8 O9 _  m4 A4 P* j
9 ?  o+ G* v. h* `4 F# C    //eWASMrelatedoutputs
  S, P" I# K4 }4 S) A5 A  b1 m
. O* A$ Y( ^& N2 D; G, @+ D    ewasm:{
4 B/ Z4 d" c- U) x2 G8 a
' |. s7 R) N* q+ W' t3 z    //S-expressionsformat
* ~% `) p7 t! t0 ]& m* p; n. b6 y4 K$ `, q1 {- R4 `
    wast:"",
* G4 t4 }1 F4 M2 `1 O. ~" s" @8 f6 v8 q, X* f
    //Binaryformat(hexstring)4 o* l- U+ v7 q. w: Q$ X& j

8 B1 S$ `* T0 ]2 t) _9 v    wasm:""7 a6 T3 \9 G* V
7 S& i8 ~4 h! B& q, _- `
    }
* Q4 H) K# r8 N
, r) I9 v% Q8 I0 z. B% u2 s    }% b: @+ J) _9 z( O3 R, v& p
0 G2 M2 ?1 Q5 @
    }1 d" z5 g/ d4 a4 @2 V- g; i0 j" T

* b$ X2 J+ S: k: Q0 |+ o    }
; B) J/ O7 x& M4 ~  x2 P
% c- w7 v, U; ^& z" Z7 Y    }
, H* p5 d2 L: R. o* X
& g' [' j" G/ `# s' ], e- o; H    错误类型说明:
: }0 f8 @* Z: n( S3 f% P6 f
' m, r6 s# Q  r0 w  ?' X/ i    3 G8 c# Y$ y7 L' z6 g

0 W, C8 i  a; S& b2 e    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。7 Q4 }/ u5 @/ J; P7 t& i: c6 {
- y1 L1 I& j' ~# }8 F
    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。* f9 ]6 Q+ N% H% b- _

/ N) [/ [  R0 F0 M    ParserError:语法f分析错误,源代码不符合语言规则。4 ^: d2 @1 V+ L8 }) D

! k9 q0 `, X# Z    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。
; i/ L% ~9 y0 l5 R- O7 D& P) ~+ m/ E7 ^; a; z% S0 l
    SytRealError:语法错误,如continue在for循环之外使用。
+ X" c" Y; q: l# ?. R7 ^/ V8 R
# {4 R. s0 B- q    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符
- D! [; A6 i4 u2 Y
9 Q2 R# t6 ^2 y2 H) T    TypeError:类型错误,如无效类型转换、无效赋值等。
5 ?3 I: M9 e) z( W3 W) i2 y5 F+ c; o) \/ O% ?  C  }+ V
    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。7 R# L+ v$ \3 |' S& }* G
& j0 C5 S0 c/ _( |. e, y
    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。
. N) B! Y! D) s/ k2 C- G: s& N; V" c$ F
    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。8 z  y2 V' n% r+ C: j6 n
" \" Q0 y. D; \# c9 B
    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。( G7 p: i3 k9 c+ n, h  ?
) m0 m# \+ }6 u% O
    FatalError:致命错误,这应该作为一个问题来反馈。
: D* U0 j0 N/ K' |; U5 x0 \) M+ Q- l
    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。
6 ~$ \, X; a) g# m6 s* S8 l4 h- P" J% o- G6 i0 t8 Y! Q" D5 f
    - {" r# Q0 _# H1 ^) ]
3 C, u% z; D" V. t- w( h4 i
    原文请访问:solc
1 {# ^& c8 g* U" S
. y0 e" h3 Y& l% {    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:8 `( w1 U2 v) m  r7 z8 G- ?" @
/ k* V1 D3 N9 B2 t
    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。
' E$ @# L' b( j9 ~! n& {
3 {  E% r! e6 w8 d5 e    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

曲水流觞113 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4