Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
solc:solidity的编译器
+ i- ~/ }! J! q3 B- C
- Z. M6 G; @5 f( G    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。
7 a6 W5 M: J' H+ Q6 I" u5 K# A  p' w. O( f$ p
    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。
% x% ?6 N) I6 ~2 X) F. L( }. D0 ~) N5 o: r/ q
    solc的安装很简单:2 D4 a: ?  j4 _2 V; I

- S/ c$ ^. E3 L% @$ o; f  g    npminstall-gsolc
  z8 S3 n) Y; a; s2 o7 r' }9 g( `4 M, {3 R: l
    //或者, P$ d+ n* F' B+ X: `- d
4 I" b* J9 u6 S# T" R& v. i
    npminstall-gsolc-cli
; x( ?4 ~( u# q* x
! r$ G/ S* s3 Z- o7 C6 d; c    //或者
6 q1 D  C9 A8 d" B% q' [. Z, y
1 @( u0 `+ ?& T# t) K$ y3 l    sudoapt-getinstallsolc+ U' N4 ?# E2 b8 I  p( j1 L5 _6 {% @

3 Z  n/ h/ c* Y0 m3 D- R% ~+ e7 n    安装完成后我们来看,solc--help,solc--help命令显示所有的solc命令选项。编译器可以生成各种输出,比如最终的二进制合约文件、语法树的汇编或者需要预计的要花费的gas等。solc--binsourceFile.sol,可以编译后输出一个名为sourceFile.sol的智能合约文件。如果你想从solc获得更丰富的一些输出变量,你可以使用solc-ooutputDirectory--bin--ast--asmsourceFile.sol。8 [1 [1 R$ [, ^( n
1 ^. e( @2 D% |! K2 s5 t1 d, Q
    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。
1 X' R0 M3 C$ V: S/ [+ m# i1 ~2 r
' M; V& q6 a, i    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:
* O( ^" f6 M2 C- H
# u8 {& J" U# {& z! v9 N    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol' ^- ?+ ~2 y; J( e, x
' V  z! Q: [- b3 t; ^
    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。
' r2 m& ]) {; u! _3 w) F; o: G, f) w8 x! s) W3 [% V
    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。% |$ L8 Q. Q% T- [
4 Q* t9 L2 C- w8 @3 N9 b6 E; U
    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。: E7 O* n) H" ^( L6 L
) U3 {4 B8 i4 C' L3 C# k
    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。8 |& N3 u, e! g8 \. h2 ]

+ U& U- U# G1 M% g* X    如果用选项--link调用Solc,则所有输入文件都被解释为未链接的二进制文件(HEX编码),在上面给出的__LibraryName____格式中,将其链接到适当地址(如果从stdin读取输入,则将其写入stdout)。在这种情况下,除了库外,所有选项都被忽略(包括-o)。, }7 B& A2 X5 ]1 m' I

0 I& Z% n  ~2 G0 L: k    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。
1 w2 a/ e( x$ ]: H: x5 K& n5 M6 l  N; `1 x6 L7 {
    #solc编译器输入输出JSON描述* F" d, J- B0 p- G7 W0 h8 p5 e
, R# \( ^& Q3 \8 ?
    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。
) _# P. L  c5 S' j! T* Y( F! {8 [1 C: ?$ p; g) p
    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。4 _) |* F& X0 k+ g4 t

# j" M& E2 q8 X3 G/ W9 c$ }3 ^7 f    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。
( {) ]6 t) O3 z7 @3 a% u
. ^7 P+ G# {6 q+ ^* m+ }    输入格式说明:, x9 b0 w6 x* R. y* C0 D; P  N

) a9 x; M) ^2 I: C/ L    {9 |4 _5 \9 c, [
9 O8 _. G2 ]5 r/ a
    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.
6 n- F$ ]& _3 J$ J
/ U' X0 m, Q1 h$ I, T4 I* F    language:"Solidity",# L9 D- e4 F/ c
3 K# ?4 E! g; s, C. g. t
    //Required$ ~0 B8 [4 ~8 ^" H5 B$ R; b
1 w% t& Y  y! f, \8 z9 q1 G
    sources:
' O$ d# m8 B+ Z4 I$ x5 [6 y* C  j$ u/ g2 f/ A7 A3 E
    {
, ]% v$ f+ Z' {" \- Q9 e6 m; e; ]3 Q) J+ a# k* g
    //Thekeysherearethe"global"namesofthesourcefiles,4 @- b3 t! Y; x

$ v) w5 S7 y; w, ~# Z    //importscanuseotherfilesviaremappings(seebelow).
" {8 H, f9 G- }( \* o7 L+ w
) |/ A- k: }8 K8 ^8 C# _    "myFile.sol":0 Q( A" Z% m$ x1 d0 z6 V% l2 [# S

  y9 H. u" V0 S" ?- K    {
/ O2 [* r5 r* [9 ~+ v: e
5 }" o. p9 P6 J0 J1 C3 H    //Optional:keccak256hashofthesourcefile
) H& P1 d4 h& s; j
/ l# ^7 n0 }" o8 e0 k; Z! x    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.
7 ]' O" I7 }4 s/ q0 B. H& b( M
9 D" N+ E8 u% y( |) _4 C$ Q" ^    "keccak256":"0x123...",
( a  D- z& {  f
" P5 e( r1 y" y  Z3 z; g; Q    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.
% w7 X5 ~/ Z0 \. E7 j8 C! E  v; t! L0 V
    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe% {: ?- W6 Z( a* f' j1 N9 Z

7 B! s4 r- {& `+ M    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe
/ k3 K- x) K1 A1 K' D/ Z
! x" v, M& l* s4 s& A    //URL(s)resultinsuccess,anerrorshouldberaised.
% }! }' D9 B& O1 q0 \* A5 R' O+ |
/ a, f# H  U6 {' \    "urls":5 _2 @0 |. O$ R; k9 L8 {# K
/ j+ w8 b0 P8 m" t4 c! H9 C3 R
    [% Z: z$ \6 t5 ^
8 j: C. P" w* |
    "bzzr://56ab...",% d! r' W. F% O8 ?6 m
1 I. P1 i& o, T: F; G
    "ipfs://Qma...",$ U& ?) q- \5 v  v- u

+ w* q3 Y/ S- z$ L    "file:///tmp/path/to/file.sol"+ F4 Y4 }- c! q/ m" e6 S
0 Y5 |8 f. p7 Y; o# M
    ]) a9 i7 N3 U" t0 I- L  `

. L9 ]% p- h. f9 d: U; R    },0 L' U9 M) d5 n% f
# U0 W9 }8 `7 n( X8 q9 h& F
    "mortal":
) [: C: c' z  ?  `$ p) b. z; N2 O
    {
5 G' M% o, J' b8 K' e4 R7 C# D1 G0 I% S  I
    //Optional:keccak256hashofthesourcefile8 E6 o& r9 ^, M2 m

0 @  W! ^; @0 V( [0 [6 w+ t! N    "keccak256":"0x234...",
+ E0 l, h9 \+ S& }' h3 Y/ L* G9 q4 _+ d6 |0 J' ?6 w
    //Required(unless"urls"isused):literalcontentsofthesourcefile
' T1 M& |1 |" X& O/ x( q  \
1 G' @8 q6 o0 A    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"
: Y- b4 _2 O) b& ]
+ n* m4 `7 v% m7 N, K; U    }: p% |5 A- P" C  Z9 e8 Y
$ X2 N& z( _! f) K8 c7 t# W
    },2 O( ~$ Q; H' N1 ?  R
, k2 J( S  v) j. D8 m
    //Optional
- ~" z) M. b9 Q+ A' D% l
3 P) @' C5 _& [* ^, I    settings:+ n. V9 x1 b& L4 Y
/ b7 @( [2 S! z% w4 K7 z8 {8 R. {
    {
; @: z/ `$ J+ i
) r" Q2 ?# j1 B9 p: T  S3 s    //Optional:Sortedlistofremappings
- m2 d  d5 s) D" b
7 b; K* N, G) |; r    remappings:[":g/dir"],& B2 S/ m) m  [5 a2 f
3 t; c$ l7 |% k
    //Optional:Optimizersettings
  l) h# v+ _; ~" Z
. [7 o; Q) `. V& d/ M$ S2 U/ h    optimizer:{
4 U& t0 u: ]% B& w& x; u' I' y7 U! P1 \" R) w4 @. d
    //disabledbydefault
1 W. N  }. n5 J; C/ z7 ^: K! v1 B3 c% N1 [/ f, n# c
    enabled:true,
5 }8 Q: M3 O, p, D/ n; k- W, o; |$ x/ n8 o6 @
    //Optimizeforhowmanytimesyouintendtorunthecode.4 x  O3 l) Q7 x4 A+ ]

& O+ m& j3 }0 ^# C7 E( Y    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.4 A  D! |5 r" l6 C

; e: V9 h4 e6 i6 q0 V" I    runs:200
8 \9 e( f, L" N0 G$ s& Q
. I! [& H5 Q. ]% h( C1 u* X    },
- R; a6 O1 e* c4 k7 T; r
7 `4 m+ U" d* F1 x* }    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople
) |  t8 I$ k8 O7 L* U$ w* K3 h, E
% W1 p9 `/ B4 O- W    //Metadatasettings(optional)
+ a* L  B% x" p1 R' v7 \5 }9 n# r+ b% f
    metadata:{
/ _, D  A7 P: T( ]: m
" T$ q, Y( K/ h2 \* g    //UseonlyliteralcontentandnotURLs(falsebydefault)
* Q& A; j/ ~& d* }% B1 M, w3 @+ B# w6 Z+ G  f& s  l9 \
    useLiteralContent:true! i6 w& ~4 j8 X+ z" ^1 g5 v
1 B9 M0 S8 O3 d4 L
    },' i& W% t0 k* n/ `: J; e% a' u- w

- b) b4 M& ~4 S3 g    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.1 g1 D# d) G* |: [
0 K: }% P% n+ l, @2 Z
    libraries:{
% ^" G- l+ _6 c- ~; S
" ~) [. t& M) Z+ W$ h8 N$ a. J; {    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.
5 b: x2 n+ p/ q& E* I
5 s/ `; @8 w2 v4 g' g    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied., f: z- [: c4 P" A8 {

7 o3 h, t5 P; I9 A3 G! n+ `% w0 x    //Ifthiskeyisanemptystring,thatreferstoagloballevel.
% P0 p4 j- T3 U6 }' \. C0 M( q: a1 X0 B' u1 r/ w$ `
    "myFile.sol":{
6 }" i8 k# f2 D" l+ m, Q/ j( \9 c6 `& t- k  _$ D+ [5 w1 |) ]! [
    "MyLib":"0x123123..."
+ u& c' R/ f3 h8 a4 I3 `( X6 e# A+ C2 t; w, `
    }% S0 K6 a1 W( P+ v. U4 |+ c. l$ e5 c

" ]. I5 z& r! q& N* I    }
" g# ?1 p% P( V' v# R, `5 b' h: U  w1 S( n: z
    //Thefollowingcanbeusedtoselectdesiredoutputs.3 \3 N# k: h, D' L4 R

, B2 f: j. u( G6 }    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.. k" ?5 N0 H7 j( [* j  c- k

1 }5 C: b# N( x, s    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,
" X* U) f6 E& x$ q7 D: N
8 _8 P* z/ r- h9 T& H    //whilethestarreferstoallofthecontracts.
% N$ M% O5 m7 |" j9 `. G% ^7 o6 j
) v" E& g: L! F    //' Z2 J* b2 _# B; ]3 G* {9 |5 ^3 Y) Q

9 a2 t2 I. [. e    //Theavailableoutputtypesareasfollows:
# W: s& C$ U" N8 R( d: {. G) @/ V4 C- f" l; c
    //abi-ABI
  l/ {* x) p# x1 d% L7 A5 y* I4 w. z
, ~) K% o# \  x% b' V" Q0 R* Y' c% q    //ast-ASTofallsourcefiles1 l8 S" i! c, Y: F( s( R' D

( }! d: _- P  E! R4 T9 G! V    //legacyAST-legacyASTofallsourcefiles
3 \: J; X8 O0 T4 x2 k8 f& p
3 q9 G4 K5 \9 Z    //devdoc-Developerdocumentation(natspec)( j! X  j8 ]7 Y) B+ @4 u/ ?

) b# a3 g5 B6 {9 \( T: B    //userdoc-Userdocumentation(natspec)
( p% v+ A  d+ s. h) l8 Q9 {8 N/ [0 @+ l
    //metadata-Metadata6 V5 K& |# g4 W# y' @5 R* l6 `
( g, C# L- D5 i0 U. g% F% y+ z; ~' j
    //ir-Newassemblyformatbeforedesugaring
. [% [. p+ R8 A( v/ f( S/ \3 o3 P/ Y: }0 t/ u0 d9 S1 m( o
    //evm.assembly-Newassemblyformatafterdesugaring3 W7 J" K- S( a& N1 u

( R/ S* \2 ], ?- Q: u: P, x+ S    //evm.legacyAssembly-Old-styleassemblyformatinJSON
  O2 I7 l: p8 V/ u; u: t: `- c+ f: `  R
    //evm.bytecode.object-Bytecodeobject
+ y7 u. W3 u5 a. x, W$ @2 m* l; G1 v  X
    //evm.bytecode.opcodes-Opcodeslist/ y. ~( A6 j( L! x  }5 w( A
! K5 ]( l  Y+ }- G
    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)
7 a5 k- \: ~+ B1 S( U- N
" D) b- ?1 Q7 Y% @" o    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)
. b3 L; ]' z! j0 S+ ~1 r9 s+ M0 |- y' t  S- |
    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)7 l+ I: Z8 j+ b  \& c. [# J5 G
5 H$ M, W& I1 l5 E6 A8 H. m
    //evm.methodIdentifiers-Thelistoffunctionhashes
- s2 \9 R' J+ g* R: @5 m+ _% z$ D! _6 a4 d! n
    //evm.gasEstimates-Functiongasestimates% H0 s. C' A; B9 L8 w4 e: m' {

& S: X: C, v& _& N. l* Z( T    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm)
+ s$ ]. z/ f. }. K7 ^) P( f
  E6 a" Q# P2 I    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)5 E1 }5 |$ D6 v: I+ s
5 N+ h' o* @0 q4 p4 n
    //
0 K: \) k' @0 R# R3 r6 M, j
# G( |+ L6 E' ^2 X  }1 r    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery, d9 ?! p+ w+ O0 V. I

7 u, A4 N# R0 Q" E    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything.
+ N! b8 r! ?3 j# k/ c# U$ n4 ^6 ]. @$ J) @( I- s+ J* X2 ^. {
    //6 T; G* `) s2 \- {

2 o3 g* B# B6 w' h* _- p8 e    outputSelection:{
8 i4 N4 C1 Q3 l, b5 B: M, u* y
, `. w' M2 }$ r1 O9 k' N    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.
- i: F/ N8 k0 y- y1 V7 Y! r
# w+ _; D# U/ Q* b6 O5 A% o    "*":{8 Z! ^* ^' Z4 h& q. C- l
- U- W7 q  V4 l
    "*":["metadata","evm.bytecode"]8 E  v1 P! I! \5 S+ ~. d
5 ?2 O* O! [, j8 [
    },
! K9 i* L0 o. F2 A
# Q. h7 i' L0 a# t5 V; N. ^    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.* i0 j2 ^$ P; O

6 G6 [  R: P  R1 G, |; _    "def":{  x7 u( j& w0 z

$ z/ }) X! u" ^    "MyContract":["abi","evm.bytecode.opcodes"]
# D" Q& r" H% J1 q4 l3 j! u: M0 _( n5 _& r7 w
    },+ j& {9 A$ ?2 Y1 v* w( j4 U$ e
& {& S+ J  B) C
    //Enablethesourcemapoutputofeverysinglecontract.  Q  T; T' ~* ~6 n! p/ [

3 L2 I0 a+ d9 d* K    "*":{
) d' N6 `2 c; k
" V$ n2 t7 Z/ s1 z& }6 E' m    "*":["evm.bytecode.sourceMap"]3 g  ^$ ?  A* P( \" c2 j  M- [
7 e8 u0 W6 z( U( H! x
    },
1 d3 g2 Q1 N: {2 i* |
! z' m  W' F$ ]3 e. \1 C    //EnablethelegacyASToutputofeverysinglefile.; J2 ]" Y" W9 r
: z: t- _' o% d
    "*":{! a3 Z0 `7 i/ e$ u4 d  l+ s

9 B' h& R# P8 T: B    "":["legacyAST"]
! e- ?+ S4 G1 B' u9 k: O) j$ |. w  L7 I7 }+ K6 b
    }0 W, V% f9 q0 e+ [  X2 _# l3 }

8 v5 `; j5 u# r! p: Y2 V( [# v* Y    }1 ~/ y& x) [* b
4 Y  @- \- Q* Z4 S0 ~
    }$ N; A! y# S4 ~8 v& }

7 t3 s1 M* B( o, N; Y4 H    }
! |  ?. ?+ o7 W1 h* f1 m+ |% d/ c3 |; p5 z  G
    输出格式说明
( f, D: v5 P# n& P/ T
0 H) V- D3 G5 H, d7 j* f    {1 M) W4 |+ {" J* \  m6 f
- R2 T5 }, I5 `. e8 u, e3 ?
    //Optional:notpresentifnoerrors/warningswereencountered
* m. E. A: u9 }; e) `0 j, ~9 R" L" X- W6 X
    errors:[
( B3 i$ {, M! T! X1 p0 u
& X5 a" |  [. A2 n2 n' y7 I/ G    {$ c+ h. n3 x$ B4 J8 ]
# c# {0 S) U$ K! k
    //Optional:Locationwithinthesourcefile.
# Z7 M1 q# c+ N9 Q3 L9 C# M5 V
- R- b6 T, f. P& Z    sourceLocation:{
, ~# w( @4 e) D1 I! ~
8 s; G6 v( a2 n7 j. o0 K; f2 {    file:"sourceFile.sol",
& |, ~, r: j% p2 B3 R6 F
: _% m7 \1 u, U. o0 q9 i# W4 q    start:0,
+ I$ j1 @" y. G8 ]" I4 m/ R4 y
' R, j8 s3 j* X# U    end:100
: B( S3 s' k1 a  ]& O; l- z. o. B/ v) H% j8 g+ \' Q: w0 b6 y2 M
    ],
/ d" X9 p5 V" G3 @0 ~6 |& ?
0 L3 m: u8 ]3 E    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.
' {" t( x0 S3 Y- j: m0 ]6 x& y0 }
8 J  I* ?* Z! R9 V9 A! x1 C    //Seebelowforcompletelistoftypes./ T6 {' d4 Q6 Q" p
* r  L4 ^& @+ }1 k( S# T9 j
    type:"TypeError",
  H5 U7 E6 O& A7 {0 T, ~* X0 x' w9 m( E! m
    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.) C0 G* Z! P' J  B3 k
( z  j( v3 K7 j" F& A, R! `5 s- d
    component:"general",4 T5 O( K/ o% `; e8 N- A0 T: x$ @
3 Y5 F( J  u4 n
    //Mandatory("error"or"warning")
9 W+ c" `" t# M  j, p- i* J: K% D& G& U9 \6 w% l: p3 d  p
    severity:"error",
! n" N, e  _! Q; T& t8 d3 Y& N4 F+ c" v- @+ J  i
    //Mandatory
; s3 F  s- ]3 A9 |! \6 @5 o$ N' Q- I9 `0 Y- h; b
    message:"Invalidkeyword"
# a5 E7 N% d7 o% N, c' A* X) |6 |
) m9 `0 q7 i4 v    //Optional:themessageformattedwithsourcelocation
+ P' m1 t4 T! r) W# g0 s, ~
3 f+ A, _2 g, \1 g2 l    formattedMessage:"sourceFile.sol:100:Invalidkeyword". m0 W% u% ?1 ^8 @4 m: O
7 N, c  F# q0 M3 H# T" d" _: v
    }! o+ B5 U  z0 F% a! `2 g! }2 a' C

0 ^) w% r, E0 O/ H8 x" P    ],
8 d! Q/ z. c/ S* _/ ~# Q! ~& J5 X% u
    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings.' `9 \$ D; F% d+ m- @
4 L0 L1 M7 b) V( d  k2 k7 Q
    sources:{
$ v+ m. A& X& Q5 V0 V$ l- O! j8 Q- c6 Y
    "sourceFile.sol":{
( L) G! I' Y$ c) h0 q/ s$ ^4 D' g: w: d/ m8 w; G
    //Identifier(usedinsourcemaps)" f* N. ?, J9 f* S
- V  M% }! N4 W: I2 U; a2 u
    id:1,' E1 E5 |$ a6 t& l& y% G

/ `  N* Z  o( k    //TheASTobject  j* f) x# P( j

2 _& ?6 p8 |* j4 m8 |    ast:{},
# e9 n7 i* \. r3 i& j" ~, i. b
  O! T# }2 m4 H4 d) F) U    //ThelegacyASTobject1 d' M  {4 t. x; W3 s
) V) c3 q# a! G7 J
    legacyAST:{}
! z8 j8 H" f2 _) R0 G3 N
8 L& m' S: Y5 F* ^1 h: ~+ R) q1 V    }
7 ^7 v6 A& a) c3 s8 C! Z) m0 P) d  C! `$ b( q
    },1 U1 f# `2 M' T9 c) [0 c
+ \# C1 H; B; F% I. R9 w4 }8 y; Q
    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.+ z: s: I* D, }/ B

- r1 H+ w# D! v5 d% D( `; Z1 D- o8 r    contracts:{2 r4 J, w5 Y8 j3 R! y

3 P9 I1 m3 D5 U    "sourceFile.sol":{( k9 D, W. M6 D- ^' D
( ?. [- n7 S3 T$ l1 E2 I
    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring., ^/ I4 M" m, i: H$ |9 A8 d# J

) ^, r- H# I4 e  z8 e    "ContractName":{
" f4 u/ X( V. T% |& b6 m9 s6 I: ~
; x/ D5 i. K- v7 e    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.! r; o% s/ W4 ~4 A9 U' k2 x4 _& Q) o

3 A9 Z- P0 A+ H) l5 A: L. E' ~    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI: l" o: K0 o* h4 z/ w8 G

, @* S/ p3 Z# F! W    abi:[],
9 y- U" O& t9 H7 G: D
2 k- e& k3 m: b) ]    //SeetheMetadataOutputdocumentation(serialisedJSONstring)
) e% x: n* Y, z0 y2 \; p. K$ w
6 Q- g$ z1 n/ T; c    metadata:"{...}",* C) X: q  x" Y
0 [4 h# ^. E/ u: ^( f/ Z/ t- a' c
    //Userdocumentation(natspec)
, [$ V4 P( K6 x+ Q, h1 ~4 _6 ^; |8 r; F2 K# g5 J9 v
    userdoc:{},5 S. s, `0 c8 y% G# H/ n

9 G$ n) K! ?2 ?6 A% G5 D1 M/ o    //Developerdocumentation(natspec); X6 b- w, c, {
0 T1 `: k" N+ z/ b7 p' S% g, J5 Y% j
    devdoc:{},
- W: z1 s* @9 }& ~  i
  }9 Y9 V  g% e8 q! I. C% I( b/ I0 I    //Intermediaterepresentation(string)! S* b3 u& J  O& m5 B( q
0 Q. w: V1 A4 N0 u, J* G6 @/ c7 p
    ir:"",
5 j5 v1 N0 e  l. o3 x& X
% x0 _* L! f9 G6 R( X& S    //EVM-relatedoutputs4 Z* I5 v; b  w
: C: L* x; W' O" U
    evm:{
  c4 r7 j6 U$ B$ d( j, i4 ]! c8 v& E
    //Assembly(string)
; |5 x* q; z! A5 W$ r/ P: X
0 |# ]% D, W7 }    assembly:"",  p& \+ w# L( T, Q. G! x
/ P$ u; G* p/ m$ }$ v
    //Old-styleassembly(object)
0 X2 x/ j9 e! i
' y3 l: X. k, O, z' R    legacyAssembly:{},
6 J1 }# A; r) |0 Y) x3 F' _+ r! p7 q- `6 F4 W( u- H
    //Bytecodeandrelateddetails.: `2 s# b+ `6 Z  L' ^

0 B/ B& U& d% y  j* E    bytecode:{4 S; g  V* @/ Z5 b  @/ g/ K: t
7 p- W( q- |( T7 @% I. Y
    //Thebytecodeasahexstring.! K) v& C% Z. Y1 N" _

7 J+ `, h- U9 i9 W9 W  P, E    object:"00fe",9 G$ n1 X5 e9 ?% R

$ Z3 C1 V* Z% v" W  Z9 y: n    //Opcodeslist(string)) r/ v! Y' S0 r' ]4 P. Q3 z

/ a& z5 i; H6 H3 ~% N4 W& n    opcodes:"",+ T, ?& {" y6 O) d- l- {

, U( _% w8 c) I' m    //Thesourcemappingasastring.Seethesourcemappingdefinition.
5 N4 r! f1 T% R2 p; ^' n0 W' X9 ?% q; }4 }- |0 Y( k
    sourceMap:"",
- l. S- `! |, K. @4 v! |, t# t9 q' H4 [
    //Ifgiven,thisisanunlinkedobject.1 r: W2 \* \5 z9 @5 l/ O

' d, g6 F6 p" Z& ~9 c& u% P9 z4 e3 `$ w    linkReferences:{
7 {0 d6 T$ i6 T" V" ?$ s; ?7 L+ _
( _  O2 Q  P: `" T) x& h    "libraryFile.sol":{
* j3 ]$ t$ W! [% i( o( [& [8 R. K
8 g/ I, I; o7 G; y. ?. g    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.7 o/ u' _  T1 N5 W+ {5 s' ~

4 z6 H2 V+ R" b2 s1 O3 l    "Library1":[1 v8 p2 Q1 f1 n- ~. i

' n. w( [" N+ W& h& B7 }5 C( e3 _" m    {start:0,length:20},
& r  H  X2 t& W2 Q  P  m3 V2 Q( ^& T
    {start:200,length:20}: q4 ]! N, X& v2 S

9 i/ t# v! F' w    ]
; l8 r' O+ v/ E0 O3 c0 G% B# w& e  ~# z: w
    }
  T3 d% U" C" J5 k4 D% a
  I8 ~7 o% o9 \& L    }
5 N2 J& a# V+ L9 O
3 m" Z; q0 c2 R$ D1 q7 Q2 x2 b    },
. r0 ~) Z1 y0 G1 D: G! g3 @- ?- E: ]3 {, J$ W
    //Thesamelayoutasabove.* K& o& _/ @) R. r% E- ]
( z6 Z/ h% B1 o( _9 u4 I
    deployedBytecode:{},
% D# A( ?. M4 O3 O: i& Y3 J+ t2 Q0 l* E4 [  H
    //Thelistoffunctionhashes( P: R; ~# R3 q% q9 j) {0 G2 @: P

- E" f/ h+ y/ J8 f: D9 t    methodIdentifiers:{
% b: C5 @0 F+ T# E: n$ J* O4 g6 H
/ B. T6 p8 J1 z9 L( r  G$ K    "delegate(address)":"5c19a95c"
  `6 Q. Y% u- `$ x
: B2 L9 L5 a$ ~, x3 x9 I) c    },
) ~& @8 F& _  r3 {0 R0 X% p# r0 s( w& ^8 L: x/ A
    //Functiongasestimates
" `3 f5 N2 p1 R" O& \$ }/ T; e: U
7 X2 p- c; X9 [6 b    gasEstimates:{( a3 ^" h! ?( j/ \. A
; K* J$ b5 l+ R0 E: r0 F4 {  P
    creation:{
; w) U* x( y. |: w9 u3 v& J% ], V' E
    codeDepositCost:"420000",
/ d; ~  X' }* T4 H% z4 h7 {
$ B; r6 ?2 }  u& r+ J8 h    executionCost:"infinite",
* D7 H1 |! I. W2 G" d6 W) {. f( \6 t! \0 i
    totalCost:"infinite"" D& _8 Y# K( d% U2 V

& o2 L3 y+ L) _! c7 k5 |$ C    },& Z, B: @' s) V" n# N
# _* z/ J, `: c
    external:{
8 b* |! ~+ s. Z6 D. T! s0 J" p) M6 G; k; [' p0 V# V" D2 m3 F
    "delegate(address)":"25000"; b! I2 K4 H% k. H/ m! ]+ ?
0 B* x/ T$ H& `8 G1 m- b  v( [
    },8 h$ P$ x* |* U/ B
+ N5 S) N7 x# F  Q1 ?
    internal:{
/ U7 C4 B, E! E& J8 J: Q0 L2 y% _, j+ R
    "heavyLifting()":"infinite"+ {- m" w7 a4 s) J/ Q: G
/ [8 i0 {. w" d
    }
/ l  q; E' _8 y
, M  o$ _- \9 E4 {4 }" y    }+ f9 m! S8 a$ S- C) q* r7 u# b3 K2 G

4 ]0 x) @  F& Y. `    },! n& M: u. S- N) u2 O, v$ b9 S

2 \5 F2 J0 k1 \3 S% v+ j    //eWASMrelatedoutputs. I; A5 G' ]$ L2 f# Q5 T$ z

+ I) S* q" X2 `) k( b* t5 T  _    ewasm:{
# @2 Q+ C; F  ^& W3 W' k( h
" f. C0 P/ d+ U0 Q: e; W% |    //S-expressionsformat
4 ^! B/ S8 W; r6 t5 |/ _5 N$ K8 w: @% C" k
    wast:"",
3 Q% N5 K/ y$ r: w5 @. _  R& v6 e9 l
    //Binaryformat(hexstring)
5 U8 r- \: w, q6 G. F5 B
* `7 b( v; F5 H* |    wasm:""9 ]9 |7 O: x7 |6 j8 K5 |

; F: Y& |( ]. a4 ?: w8 @0 x    }
8 g0 V4 n1 f. j9 X4 c: X$ M; L$ p7 E/ u& t8 e$ F- P# W2 q  v( t5 d" Y2 R
    }- m6 k! ]8 G2 C7 y0 B
% ^2 g# |  L* [( F
    }
3 Z+ C3 S1 ]% z3 ^" r7 [1 A7 |! E% c$ C
    }8 B) H0 S. Q: E! G  K; h

0 F; b% V5 s) l# i7 f2 O, W    }
' z5 ]2 y- [6 i( y8 ]  s: ?; m
) f. t# r/ p0 w# t  j1 x0 B- `    错误类型说明:$ i# x6 q) H+ k% H. l) V
6 u+ {9 n! C3 I3 f4 r
    1 y. p) R, r, N$ ^+ a. W' z
1 ^4 ], e/ v; u6 ]" e" l/ g
    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。# z+ |; E' X" D$ ^5 y

4 u" J% t+ ]$ p0 \9 a    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。
* O7 B' `% }2 e8 B) G
1 \+ o1 C9 a$ j: V    ParserError:语法f分析错误,源代码不符合语言规则。
7 u" \' A- q% \  X* M4 A* t8 q( G6 l. E3 P2 b. J. R7 s
    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。
) M; S' ^: ^1 {: d, d* w. A4 s% J1 T5 R6 E0 ]5 @: g& i  @4 @
    SytRealError:语法错误,如continue在for循环之外使用。
% p2 j# Q5 x& j7 _8 l4 ~/ J0 v, [' V% ~2 U7 R/ A) N
    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符
" G2 `2 ^, C3 ~5 X, ~* Z1 y: o3 `; J# a
    TypeError:类型错误,如无效类型转换、无效赋值等。
0 q( k( L8 S9 T- U: B. B  R) B1 s+ q8 X9 M0 o4 V) x
    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。
! y) l7 O$ e9 a1 V" ?: L3 W9 d- ~# G9 p# t6 K# |. O1 |3 F6 O2 E4 {; k- a
    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。  \5 l3 x: E" ?) H

% k9 F; t: Z+ Y# D- {- u4 d7 e2 f    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。% e* J& g1 X: Q, ^# a0 w1 l

9 N8 D. G/ a/ j8 m, k: i    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。; y8 l4 h; y; Y; b1 t* g

5 R$ d% u9 _7 p4 n9 H    FatalError:致命错误,这应该作为一个问题来反馈。8 S; N. V  c/ R
& |" E/ F, b% E( Z" h2 f
    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。
. {; Y& @# ^' M2 D7 W2 c! d; x5 J! L! i$ [5 Q/ Y0 H
   
1 J- V* R+ l5 a6 ?* T& r: K: x( h1 T- I# [; _% _
    原文请访问:solc2 O/ f/ j, N5 w/ W. ?! ]' S+ ]/ t
+ G( t# L. Z7 Q2 s7 |
    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:
9 p6 w; t9 l, g* a' N
& h- T3 `  Z9 D# b    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。
9 u9 e& S: Q) X9 {; x" l4 ]+ x) t1 R: V, h' f# n: a
    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

曲水流觞113 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    4