Hi Guest

More contents, please log on!

Bitmere.com 区块链技术 Content
solc:solidity的编译器

    solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译,成为以太坊虚拟机中的代码。solc编译后最终部署到链上形成我们所见到的各种智能合约。

    作为一个solidity命令行编译工具,我们来看看官网都怎么说solc。

    solc的安装很简单:

    npminstall-gsolc

    //或者

    npminstall-gsolc-cli

    //或者

    sudoapt-getinstallsolc

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

    你在部署以太坊智能合约之前可以用solc--optimize--binsourceFile.sol优化一下。默认情况下solc编译器会帮你优化200次。你也可以设置--runs=1,这样就按照最小化的方式进行编译,如果你希望多次交易不太在乎成本,那你可以设置成你想要的次数:)。

    命令行编译器会自动读取需要导入的文件,也可以通过使用prefix=path来指定路径,例如:

    solcgithub.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/=/usr/local/lib/fallbackfile.sol

    这样编译器就会从指定目录github.com/ethereum/dapp-bin/下的/usr/local/lib/dapp-bin/目录开始搜索,如果没有找到文件,它将查看/usr/local/lib/fallback。solc将只读取你指定的这两个路径的,因此像import"/etc/passwd";必须要通过/=重新映射才起作用。如果有多个匹配,则选择具有最长公共前缀的进行匹配。

    出于安全上的考虑,编译器限制了它可以访问的一些目录。在命令行中指定的源文件的路径(及其子目录)和命令行指定的路径外其他所有内容都会被拒绝。--allow-paths/sample/path,/another/sample/path来切换。

    如果智能合约使用了libraries,你会注意到字节码包含了__LibraryName______的子字符串。您可以使用solc作为链接器,这意味着它将在这些点为您插入库地址。

    可以通过添加库--libraries"Math:0x12345678901234567890Heap:0xabcdef0123456"到您的命令,以提供每个库的地址,或者使用文件中的说明字符串(每行一个库),并使用--librariesfileName运行solc。

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

    如果用--standard-json调用SOLC,它就将标准的JSON输入(如下所述),并返回JSON输出。

    #solc编译器输入输出JSON描述

    这些JSON格式通过编译器API使用,可以通过SOLC获得。内容都是可以修改的,一些对象是可选的(如前所述),其目的是向后兼容。

    编译器的API需要一个JSON格式的输入,然后以JSON格式输出编译结果。

    注意不允许注释。下面示例中的注释,是官网为了学习者更好的理解标注的。

    输入格式说明:

    {

    //Required:Sourcecodelanguage,suchas"Solidity","serpent","lll","assembly",etc.

    language:"Solidity",

    //Required

    sources:

    {

    //Thekeysherearethe"global"namesofthesourcefiles,

    //importscanuseotherfilesviaremappings(seebelow).

    "myFile.sol":

    {

    //Optional:keccak256hashofthesourcefile

    //ItisusedtoverifytheretrievedcontentifimportedviaURLs.

    "keccak256":"0x123...",

    //Required(unless"content"isused,seebelow):URL(s)tothesourcefile.

    //URL(s)shouldbeimportedinthisorderandtheresultcheckedagainstthe

    //keccak256hash(ifavailable).Ifthehashdoesn'tmatchornoneofthe

    //URL(s)resultinsuccess,anerrorshouldberaised.

    "urls":

    [

    "bzzr://56ab...",

    "ipfs://Qma...",

    "file:///tmp/path/to/file.sol"

    ]

    },

    "mortal":

    {

    //Optional:keccak256hashofthesourcefile

    "keccak256":"0x234...",

    //Required(unless"urls"isused):literalcontentsofthesourcefile

    "content":"contractmortalisowned{functionkill(){if(msg.sender==owner)selfdestruct(owner);}}"

    }

    },

    //Optional

    settings:

    {

    //Optional:Sortedlistofremappings

    remappings:[":g/dir"],

    //Optional:Optimizersettings

    optimizer:{

    //disabledbydefault

    enabled:true,

    //Optimizeforhowmanytimesyouintendtorunthecode.

    //Lowervalueswilloptimizemoreforinitialdeploymentcost,highervalueswilloptimizemoreforhigh-frequencyusage.

    runs:200

    },

    evmVersion:"byzantium",//VersionoftheEVMtocompilefor.Affectstypecheckingandcodegeneration.Canbehomestead,tangerineWhistle,spuriousDragon,byzantiumorconstantinople

    //Metadatasettings(optional)

    metadata:{

    //UseonlyliteralcontentandnotURLs(falsebydefault)

    useLiteralContent:true

    },

    //Addressesofthelibraries.Ifnotalllibrariesaregivenhere,itcanresultinunlinkedobjectswhoseoutputdataisdifferent.

    libraries:{

    //Thetoplevelkeyisthethenameofthesourcefilewherethelibraryisused.

    //Ifremappingsareused,thissourcefileshouldmatchtheglobalpathafterremappingswereapplied.

    //Ifthiskeyisanemptystring,thatreferstoagloballevel.

    "myFile.sol":{

    "MyLib":"0x123123..."

    }

    }

    //Thefollowingcanbeusedtoselectdesiredoutputs.

    //Ifthisfieldisomitted,thenthecompilerloadsanddoestypechecking,butwillnotgenerateanyoutputsapartfromerrors.

    //Thefirstlevelkeyisthefilenameandthesecondisthecontractname,whereemptycontractnamereferstothefileitself,

    //whilethestarreferstoallofthecontracts.

    //

    //Theavailableoutputtypesareasfollows:

    //abi-ABI

    //ast-ASTofallsourcefiles

    //legacyAST-legacyASTofallsourcefiles

    //devdoc-Developerdocumentation(natspec)

    //userdoc-Userdocumentation(natspec)

    //metadata-Metadata

    //ir-Newassemblyformatbeforedesugaring

    //evm.assembly-Newassemblyformatafterdesugaring

    //evm.legacyAssembly-Old-styleassemblyformatinJSON

    //evm.bytecode.object-Bytecodeobject

    //evm.bytecode.opcodes-Opcodeslist

    //evm.bytecode.sourceMap-Sourcemapping(usefulfordebugging)

    //evm.bytecode.linkReferences-Linkreferences(ifunlinkedobject)

    //evm.deployedBytecode*-Deployedbytecode(hasthesameoptionsasevm.bytecode)

    //evm.methodIdentifiers-Thelistoffunctionhashes

    //evm.gasEstimates-Functiongasestimates

    //ewasm.wast-eWASMS-expressionsformat(notsupportedatm)

    //ewasm.wasm-eWASMbinaryformat(notsupportedatm)

    //

    //Notethatusingausing`evm`,`evm.bytecode`,`ewasm`,etc.willselectevery

    //targetpartofthatoutput.Additionally,`*`canbeusedasawildcardtorequesteverything.

    //

    outputSelection:{

    //Enablethemetadataandbytecodeoutputsofeverysinglecontract.

    "*":{

    "*":["metadata","evm.bytecode"]

    },

    //EnabletheabiandopcodesoutputofMyContractdefinedinfiledef.

    "def":{

    "MyContract":["abi","evm.bytecode.opcodes"]

    },

    //Enablethesourcemapoutputofeverysinglecontract.

    "*":{

    "*":["evm.bytecode.sourceMap"]

    },

    //EnablethelegacyASToutputofeverysinglefile.

    "*":{

    "":["legacyAST"]

    }

    }

    }

    }

    输出格式说明

    {

    //Optional:notpresentifnoerrors/warningswereencountered

    errors:[

    {

    //Optional:Locationwithinthesourcefile.

    sourceLocation:{

    file:"sourceFile.sol",

    start:0,

    end:100

    ],

    //Mandatory:Errortype,suchas"TypeError","InternalCompilerError","Exception",etc.

    //Seebelowforcompletelistoftypes.

    type:"TypeError",

    //Mandatory:Componentwheretheerrororiginated,suchas"general","ewasm",etc.

    component:"general",

    //Mandatory("error"or"warning")

    severity:"error",

    //Mandatory

    message:"Invalidkeyword"

    //Optional:themessageformattedwithsourcelocation

    formattedMessage:"sourceFile.sol:100:Invalidkeyword"

    }

    ],

    //Thiscontainsthefile-leveloutputs.Incanbelimited/filteredbytheoutputSelectionsettings.

    sources:{

    "sourceFile.sol":{

    //Identifier(usedinsourcemaps)

    id:1,

    //TheASTobject

    ast:{},

    //ThelegacyASTobject

    legacyAST:{}

    }

    },

    //Thiscontainsthecontract-leveloutputs.Itcanbelimited/filteredbytheoutputSelectionsettings.

    contracts:{

    "sourceFile.sol":{

    //Ifthelanguageusedhasnocontractnames,thisfieldshouldequaltoanemptystring.

    "ContractName":{

    //TheEthereumContractABI.Ifempty,itisrepresentedasanemptyarray.

    //Seehttps://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI

    abi:[],

    //SeetheMetadataOutputdocumentation(serialisedJSONstring)

    metadata:"{...}",

    //Userdocumentation(natspec)

    userdoc:{},

    //Developerdocumentation(natspec)

    devdoc:{},

    //Intermediaterepresentation(string)

    ir:"",

    //EVM-relatedoutputs

    evm:{

    //Assembly(string)

    assembly:"",

    //Old-styleassembly(object)

    legacyAssembly:{},

    //Bytecodeandrelateddetails.

    bytecode:{

    //Thebytecodeasahexstring.

    object:"00fe",

    //Opcodeslist(string)

    opcodes:"",

    //Thesourcemappingasastring.Seethesourcemappingdefinition.

    sourceMap:"",

    //Ifgiven,thisisanunlinkedobject.

    linkReferences:{

    "libraryFile.sol":{

    //Byteoffsetsintothebytecode.Linkingreplacesthe20byteslocatedthere.

    "Library1":[

    {start:0,length:20},

    {start:200,length:20}

    ]

    }

    }

    },

    //Thesamelayoutasabove.

    deployedBytecode:{},

    //Thelistoffunctionhashes

    methodIdentifiers:{

    "delegate(address)":"5c19a95c"

    },

    //Functiongasestimates

    gasEstimates:{

    creation:{

    codeDepositCost:"420000",

    executionCost:"infinite",

    totalCost:"infinite"

    },

    external:{

    "delegate(address)":"25000"

    },

    internal:{

    "heavyLifting()":"infinite"

    }

    }

    },

    //eWASMrelatedoutputs

    ewasm:{

    //S-expressionsformat

    wast:"",

    //Binaryformat(hexstring)

    wasm:""

    }

    }

    }

    }

    }

    错误类型说明:

   

    JSONError:JSON错误,JSON输入不符合要求的格式,例如输入不是JSON对象,不支持语言,等等。

    IOError:IO错误,IO和导入处理错误,如提供的源中的不可解析URL或hash不匹配。

    ParserError:语法f分析错误,源代码不符合语言规则。

    DocstringParsingError:文档解析错误,无法解析注释块中的NATSPEC标记。

    SytRealError:语法错误,如continue在for循环之外使用。

    DeclarationError:声明错误,无效、不可解析或冲突的标识符名称。例如未找到标识符

    TypeError:类型错误,如无效类型转换、无效赋值等。

    UnimplementedFeatureError:编译器不支持该特性,但希望在将来的版本中得到支持。

    InternalCompilerError:编译器中触发内部错误,这应该作为一个问题来反馈。

    Exception:例外,编译过程中未知的故障,这应该作为一个问题反馈。

    CompilerError:编译错误,编译器堆栈的使用无效,这应该作为一个问题来反馈。

    FatalError:致命错误,这应该作为一个问题来反馈。

    Warning:警告并没有停止编译,但如果可能的话,应该加以处理。

   

    原文请访问:solc

    如果你希望马上开始学习以太坊DApp开发,推荐访问一个在线教程:

    以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。

    以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
BitMere.com is Information release platform,just provides information storage space services.
The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
You have to log in before you can reply Login | 立即注册

Points Rules

Write the first review

曲水流觞113 小学生
  • Follow

    0

  • Following

    0

  • Articles

    3

59600
Promoted