.. index:: ! commandline compiler, compiler;commandline, ! solc, ! linker
Note
μ΄ μΉμ μ :ref:`solcjs <solcjs>` μ μ μ© λμ§ μμ΅λλ€.
Solidity μ μ₯μμ λΉλ λμ μ€ νλλ Solidity λͺ
λ Ήν μ»΄νμΌλ¬μΈ solc
μ
λλ€,
solc --help
λ₯Ό μ¬μ©νλ©΄ λͺ¨λ μ΅μ
μ λν μ€λͺ
μ μ 곡ν©λλ€. μ»΄νμΌλ¬λ κ°λ¨ν ꡬ문 νΈλ¦¬ (ꡬ문 λΆμ νΈλ¦¬)λ₯Ό ν΅ν κ°λ¨ν λ°μ΄λ리 λ° μ΄μ
λΈλ¦¬λΆν° κ°μ€ μ¬μ©λ νκ°μ μ΄λ₯΄κΈ°κΉμ§ λ€μν μΆλ ₯μ μμ± ν μ μμ΅λλ€.
λ§μ½ λ¨μΌ νμΌλ§ μ»΄νμΌ νκΈ°λ₯Ό μνλ€λ©΄, solc --bin sourceFile.sol
λ₯Ό μ€ννμΈμ. λ°μ΄λλ¦¬κ° μΆλ ₯ λ κ²μ
λλ€. λΉμ μ 컨νΈλ νΈλ₯Ό
λ°°μΉ(deploy)νκΈ°μ μ solc --optimize --bin sourceFile.sol
λ₯Ό μ΄μ©νμ¬ μ»΄νμΌνλ λμ μ΅μ νκΈ°(Optimizer)λ₯Ό νμ±ν μν€μΈμ.
λ§μ½ μ‘°κΈλ μ§λ³΄λ λ€λ₯Έ ννμ solc
μ κ²°κ³Όλ₯Ό μ»κΈ°λ₯Ό μνλ€λ©΄, μλ§λ solc -o outputDirectory --bin --ast --asm sourceFile.sol
λ₯Ό μ¬μ©νμ¬ λΆν νμΌλ€μ λͺ¨λ μΆλ ₯νλλ‘ λͺ
λ Ήνλ κ²μ΄ μ’μ κ²μ
λλ€.
λͺ
λ Ήν μ»΄νμΌλ¬λ μλμ μΌλ‘ νμΌ μμ€ν
μΌλ‘ λΆν° μμ
λ(imported) νμΌλ€μ μ½μ΅λλ€. κ·Έλ¬λ
μλμ λ°©λ²μΌλ‘ prefix=path
λ₯Ό μ¬μ©ν΄ 리λ€μ΄λ νΈν κ²½λ‘λ₯Ό μ 곡νλ κ² λν κ°λ₯ν©λλ€.
solc github.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/ =/usr/local/lib/fallback file.sol
μ΄κ²μ λ³Έμ§μ μΌλ‘ /usr/local/lib/dapp-bin
μλμ μλ github.com/ethereum/dapp-bin/
λ‘ μμνλ κ²μ κ²μνλΌκ³ μ»΄νμΌλ¬μκ²
μ§μν©λλ€. κ·Έλ¦¬κ³ λ§μ½ κ±°κΈ°μ μλ νμΌμ μ°Ύμ§ λͺ»νλ€λ©΄, μ»΄νμΌλ¬λ /usr/local/lib/fallback
λ₯Ό μ΄ν΄ λ³Όκ²μ
λλ€. (곡백μ μ λμ¬λ νμ μΌμΉνλ€.)
solc
μ μΈλΆμ μ¬ λ§΅ν λμ μΈλΆμ λͺ
μμ μΌλ‘ μμ€νμΌ μμΉκ° λͺ
μλ λλ ν°λ¦¬ μΈλΆμ μλ νμΌ μμ€ν
μΌλ‘ λΆν°
νμΌ μμ€ν
λ‘ λΆν° νμΌλ€μ μ½μ§ μμ΅λλ€. κ·Έλ¬λ―λ‘ import "/etc/passwd";
μ κ°μ κ²λ€μ μ€μ§ μ¬λ§΅ ν(remapping)μΌλ‘μ =/
μΆκ°νλ κ²½μ°μλ§
μλν©λλ€.
λ§μ½ μ¬λ§΅νμΌλ‘ μΈν΄ μ¬λ¬ μΌμΉ νλͺ©μ΄ μλ κ²½μ° κ°μ₯ κΈ΄ κ³΅ν΅ μ λμ¬κ° μλ νλͺ©μ΄ μ νλ©λλ€.
보μμμ μ΄μ λ€λ‘ μ»΄νμΌλ¬λ μ‘μΈμ€ ν μ μλ λλ ν°λ¦¬λ₯Ό μ νν©λλ€. λͺ
λ Ήνμ λͺ
μλ μμ€νμΌ κ²½λ‘(λ° ν΄λΉ νμ λλ ν°λ¦¬)μ μ¬λ§΅νμ μν΄ μ μ λ κ²½λ‘λ€μ
import λ¬Έμμ νμ©λ©λλ€, κ·Έλ¬λ λ€λ₯Έ λͺ¨λ κ²λ€μ κ±°μ λ©λλ€. μΆκ°μ μΈ κ²½λ‘(λ° κ·Έκ²μ νμ λλ ν°λ¦¬)λ --allow-paths /sample/path,/another/sample/path
μ€μμΉλ₯Ό ν΅ν΄ νμ© λ μ μμ΅λλ€.
λ§μ½ 컨νΈλ νΈκ° :ref:`libraries <libraries>` λ₯Ό μ¬μ©νλ€λ©΄, λ°μ΄νΈμ½λκ° __LibraryName______
μ νμ λ¬Έμμ΄(substrings)λ₯Ό ν¬ν¨νλ€λ κ²μ μμμΌν©λλ€.
κ·Έ μ§μ μ λΉμ μ λΌμ΄λΈλ¬λ¦¬ μ£Όμκ° μ½μ
λ κ²μ μλ―Ένλ λ§μ»€λ‘μ¨ solc
μ μ¬μ© ν μ μμ΅λλ€.
κ°κ°μ λΌμ΄λΈλ¬λ¦¬ μ£Όμλ₯Ό μ 곡νκΈ° μν΄μ 컀맨λμ --libraries "Math:0x12345678901234567890 Heap:0xabcdef0123456"
λ₯Ό μΆκ°νλμ§ νμΌ(νμ€μ νλμ λΌμ΄λΈλ¬λ¦¬)μ λ¬Έμμ΄μ μ μ₯νκ³ --libraries fileName
λ₯Ό μ¬μ©νμ¬ solc
λ₯Ό μ€ννμΈμ
λ§μ½ solc
κ° --link
μ΅μ
κ³Ό ν¨κ» νΈμΆ λλ€λ©΄, λͺ¨λ μ
λ ₯ νμΌ λ€μ μ£Όμ΄μ§ __LibraryName____
νμμ μ°κ²°(link)λμ§ μμ (16μ§μλ‘ μΈμ½λ λ)λ°μ΄λ리λ€λ‘ ν΄μλμ΄ νμ¬ μμΉμ μ°κ²° λ©λλ€(λ§μ½ μ
λ ₯μ΄ stdinμΌλ‘ λΆν° μ½μ΄μ¨κ²μ΄λΌλ©΄, κ·Έκ²μ stdoutμΌλ‘ μ°μ¬μ§λλ€). --libraries
λ₯Ό μ μΈν λͺ¨λ μ΅μ
μ μ΄ κ²½μ°μ 무μλ©λλ€(-o
ν¬ν¨)
λ§μ½ solc
κ° μ΅μ
--standard-json
κ³Ό ν¨κ» νΈμΆ λμλ€λ©΄, κ·Έκ²μ νμ€ μ
λ ₯μμ JSON μ
λ ₯(μλμ μ€λͺ
)μ κΈ°λν©λλ€ κ·Έλ¦¬κ³ νμ€μΆλ ₯μ JSONμΆλ ₯μ λ°νν©λλ€..
μ΄λ¬ν JSON νμμ solc
λ₯Ό ν΅ν΄ κ°λ₯νκ²κ³Ό κ°μ΄ μ»΄νμΌλ¬ APIμ μν΄ μ¬μ©λ©λλ€. μ΄λ¬ν κ²λ€μ λ³νλ μ μκ³ , λͺλͺ νλλ μ νμ μ΄μ§λ§(μμμ λ§νλλ‘), μ΄μ λ²μ κ³Όμ νΈνμ±μ μν΄μλ§ μ¬μ©λ©λλ€.
μ»΄νμΌλ¬ APIλ JSON νμμΌλ‘ μ λ ₯μ κΈ°λνκ³ JSON νμμΌλ‘ μ»΄νμΌμ κ²°κ³Όλ₯Ό μΆλ ₯ν©λλ€.
μ£Όμμ λΉμ°ν μ€λͺ λͺ©μ μΌλ‘λ§ νμ©λκ³ μ¬κΈ°μ μ¬μ©λμ§ μμ΅λλ€.
{
// Required: Source code language, such as "Solidity", "serpent", "lll", "assembly", etc.
language: "Solidity",
// Required
sources:
{
// μ¬κΈ°μ μ΄ ν€λ μμ€μ½λ νμΌλ€μ "μ μ(global)" μ΄λ¦λ€μ
λλ€.
// μν¬νΈλ μ¬λ§΅νμ ν΅ν΄ λ€λ₯Έ νμΌμ μ¬μ©ν μ μμ΅λλ€.
"myFile.sol":
{
// μ νμ : μμ€ νμΌμ keccak256 ν΄μ
// μ΄κ²μ URLμ ν΅ν΄ μν¬νΈλ κ²½μ° λ΄μ©μ κ²μ¦νκΈ° μν΄ μ¬μ©λ©λλ€.
"keccak256": "0x123...",
// Required (λ§μ½ "content"κ° μ¬μ©λμ§ μμλ€λ©΄ μλλ₯Ό 보μΈμ): μμ€νμΌμ URL
// URL(s) should be imported in this order and the result checked against the
// keccak256 hash (if available). If the hash doesn't match or none of the
// URLμ μ¬κΈ° μμ μν¬νΈ λμ΄μΌλ§ ν©λλ€. κ·Έλ¦¬κ³ κ²°κ³Όλ keccak256 ν΄μμ λν΄
// νμΈν΄μΌ ν©λλ€. (κ°λ₯ν κ²½μ°μ). λ§μ½ ν΄μκ° λ§μ§ μκ±°λ μ±κ³΅ν URLμ΄ μλ€λ©΄
// μλ¬κ° λ°μν΄μΌ ν©λλ€.
"urls":
[
"bzzr://56ab...",
"ipfs://Qma...",
"file:///tmp/path/to/file.sol"
]
},
"mortal":
{
// Optional: μμ€νμΌμ keccak256 ν΄μ
"keccak256": "0x234...",
// Required (λ§μ½ "urls"κ° μ¬μ©λμ§ μμΌλ©΄): μμ€ νμΌμ 리ν°λ΄ λ΄μ©
"content": "contract mortal is owned { function kill() { if (msg.sender == owner) selfdestruct(owner); } }"
}
},
// Optional
settings:
{
// Optional: μ¬λ§΅νμ μ λ ¬λ 리μ€νΈ
remappings: [ ":g/dir" ],
// Optional: μ΅μ νκΈ° (enabled defaults to false)
optimizer: {
enabled: true,
runs: 500
},
evmVersion: "byzantium", // Version of the EVM to compile for. Affects type checking and code generation. Can be homestead, tangerineWhistle, spuriousDragon, byzantium or constantinople
// Metadata settings (optional)
metadata: {
// URLμ΄ μλ 리ν°λ΄ λ΄μ©λ§ μ¬μ©νμΈμ. (κΈ°λ³Έκ° : false)
useLiteralContent: true
},
// λΌμ΄λΈλ¬λ¦¬λ€μ μ£Όμ. λ§μ½ λͺ¨λ λΌμ΄λΈλ¬λ¦¬κ° μ¬κΈ°μ μ£Όμ΄μ§μ§ μλλ€λ©΄, κ·Έκ²μ μΆλ ₯ λ°μ΄ν°κ° λ€λ₯Έ μ°κ²°λμ§ μμ κ°μ²΄λ₯Ό μ΄λ‘ν μ μμ΅λλ€.
libraries: {
// μ΅μμ λ 벨 ν€λ λΌμ΄λΈλ¬λ¦¬κ° μ¬μ©λ μμ€νμΌμ μ΄λ¦μ
λλ€.
// λ§μ½ μ¬λ§΅νμ΄ μ¬μ©λμλ€λ©΄, μ¬ λ§΅νμ΄ μ μ©λ νμ, μ΄ μμ€ νμΌμ μ μ κ²½λ‘κ° μΌμΉν΄μΌ ν©λλ€.
// λ§μ½ μ΄ ν€κ° λΉ λ¬Έμμ΄μ΄λΌλ©΄, κ·Έκ²μ μ μ μμ€μ μ°Έμ‘°ν©λλ€.
"myFile.sol": {
"MyLib": "0x123123..."
}
}
// The following can be used to select desired outputs.
// μλμ μ½λλ μνλ μΆλ ₯μ μ ννλλ° μ¬μ©ν μ μμ΅λλ€.
// λ§μ½ μ΄ νλκ° λλ½ λλ€λ©΄, μ»΄νμΌλ¬λ λΆλ¬μ€κ³ νμ
μ μ²΄ν¬ ν©λλ€. κ·Έλ¬λ μλ¬λ¬λΆν° μ΄λ ν μλ¬λ μμ±νμ§ μμ΅λλ€.
// 첫λ²μ§Έ λ 벨μ ν€λ νμΌ μ΄λ¦μ΄κ³ λλ²μ¬λ 컨νΈλ νΈ μ΄λ¦μ
λλ€. μ¬κΈ°μ λΉ κ³μ½μ΄λ¦μ νμΌ μ체λ₯Ό λνλ
λλ€,
// starκ° μ»¨νΈλ νΈμ λͺ¨λ λ΄μ©μ μ°Έμ‘°νλ λμ.
//
// μλλ κ°λ₯ν μΆλ ₯ νμ
μ
λλ€.
// abi - ABI
// ast - λͺ¨λ μμ€νμΌμ AST
// legacyAST - λͺ¨λ μμ€νμΌμ legacy AST
// devdoc - κ°λ°μ λ¬Έμ (natspec)
// userdoc - μ¬μ©μ λ¬Έμ (natspec)
// metadata - λ©νλ°μ΄ν°
// ir - desugaringμ΄μ μ μλ‘μ΄ μ΄μ
λΈλ¦¬ νμ
// evm.assembly - desugaringμ΄νμ μλ‘μ΄ μ΄μ
λΈλ¦¬ νμ
// evm.legacyAssembly - μ΄μ μ€νμΌμ JSONνμ μ΄μ
λΈλ¦¬
// evm.bytecode.object - λ°μ΄νΈ μ½λ κ°μ²΄
// evm.bytecode.opcodes - Opcodes 리μ€νΈ
// evm.bytecode.sourceMap - μμ€ λ§΅ν (λλ²κ·Έμ μ μ©ν¨)
// evm.bytecode.linkReferences - λ§ν¬ μ°Έμ‘° (if unlinked object)
// evm.deployedBytecode* - λ°°ν¬λ λ°μ΄νΈμ½λ (evm.bytecodeκ³Ό λμΌν μ΅μ
μ κ°μ§)
// evm.methodIdentifiers - ν΄μν¨μ 리μ€νΈ
// evm.gasEstimates - κ°μ€ μΈ‘μ ν¨μ
// ewasm.wast - eWASM S-expressions format (not supported atm)
// ewasm.wasm - eWASM λ°μ΄ν°λ¦¬ λ°μ΄ν° (not supported atm)
//
// Note that using a using `evm`, `evm.bytecode`, `ewasm`, etc. will select every
// target part of that output. Additionally, `*` can be used as a wildcard to request everything.
//
outputSelection: {
// Enable the metadata and bytecode outputs of every single contract.
"*": {
"*": [ "metadata", "evm.bytecode" ]
},
// Enable the abi and opcodes output of MyContract defined in file def.
"def": {
"MyContract": [ "abi", "evm.bytecode.opcodes" ]
},
// Enable the source map output of every single contract.
"*": {
"*": [ "evm.bytecode.sourceMap" ]
},
// Enable the legacy AST output of every single file.
"*": {
"": [ "legacyAST" ]
}
}
}
}
{
// μ νμ : μλ¬λ κ²½κ³ κ° λ°μ νλμ§ λνλ΄μ§ μμ΅λλ€.
errors: [
{
// Optional: μμ€ νμΌμ μμΉ.
sourceLocation: {
file: "sourceFile.sol",
start: 0,
end: 100
],
// μ무μ : "TypeError", "InternalCompilerError", "Exception"λ± κ³Ό κ°μ μλ¬ νμ
// μλ νμ
리μ€νΈλ₯Ό 보μΈμ.
type: "TypeError",
// μ무μ : "general", "ewasm"λ±κ³Ό κ°μ μλ¬κ° λ°μν μ»΄ν¬λνΈ
component: "general",
// μ무μ ("error" or "warning")
severity: "error",
// μ무μ
message: "Invalid keyword"
// μ νμ : μμ€ μμΉλ₯Ό ν¬ν¨ν νμμ κ°μΆ λ©μΈμ§
formattedMessage: "sourceFile.sol:100: Invalid keyword"
}
],
// μ΄κ²μ νμΌ μμ€ μΆλ ₯μ ν¬ν¨ν©λλ€. μ΄κ²μ outputSelection μ€μ μ μν΄ μ νλκ³ κ±Έλ¬μ§ μ μμ΅λλ€.
sources: {
"sourceFile.sol": {
// Identifier (used in source maps)
id: 1,
// The AST object
ast: {},
// The legacy AST object
legacyAST: {}
}
},
// μ΄κ²μ 컨νΈλ νΈ μμ€ μΆλ ₯μ ν¬ν¨ν©λλ€. μ΄κ²μ outputSelectionμ€μ μ μν΄ μ νλκ³ κ±Έλ¬μ§ μ μμ΅λλ€.
contracts: {
"sourceFile.sol": {
// λ§κ°Ή μ¬μ©λ μΈμ΄κ° 컨νΈλ νΈ μ΄λ¦μ κ°μ§κ³ μμ§ μλ€λ©΄, μ΄ νλλ λΉ λ¬Έμμ΄κ³Ό κ°μμΌ ν©λλ€.
"ContractName": {
// μ΄λ리μ 컨νΈλ νΈ ABI. λ§μ½ λΉμ΄μλ€λ©΄, μ΄κ²μ λΉ λ°°μ΄μ λνλ
λλ€.
// https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI λ₯Ό νμΈν΄ 보μΈμ.
abi: [],
// λ©νλ°μ΄ν° μΆλ ₯ λ¬Έμλ₯Ό νμΈν΄λ³΄μΈμ.
metadata: "{...}",
// μ¬μ©μ λ¬Έμ (natspec)
userdoc: {},
// κ°λ°μ λ¬Έμ (natspec)
devdoc: {},
// μ€κ° νν (string)
ir: "",
// EVM-related outputs
evm: {
// Assembly (string)
assembly: "",
// μ΄μ μ€νμΌμ μ΄μ
λΈλ¦¬ (object)μ
λλ€.
legacyAssembly: {},
// λ°μ΄νΈ μ½λμ μμΈν λ΄μ©.
bytecode: {
// 16μ§μ μΈ λ°μ΄νΈ μ½λμ
λλ€.
object: "00fe",
// OPcodes 리μ€νΈ (string)μ
λλ€.
opcodes: "",
// λ¬Έμμ΄λ‘μ¨ μμ€ λ§΅νμ
λλ€. μμ€ λ§΅ν μ μλ₯Ό νμΈν΄ 보μΈμ.
sourceMap: "",
// μ£Όμ΄μ‘λ€λ©΄, μ΄κ²μ μ°κ²°λμ§ μμ κ°μ²΄μ
λλ€.
linkReferences: {
"libraryFile.sol": {
// Byte offsets into the bytecode. Linking replaces the 20 bytes located there.
"Library1": [
{ start: 0, length: 20 },
{ start: 200, length: 20 }
]
}
}
},
// μμ κ°μ λ μ΄μμ μ
λλ€.
deployedBytecode: { },
// ν΄μ ν¨μ 리μ€νΈ μ
λλ€.
methodIdentifiers: {
"delegate(address)": "5c19a95c"
},
// Function gas estimates
// κ°μ€ μμΈ‘ ν¨μ μ
λλ€.
gasEstimates: {
creation: {
codeDepositCost: "420000",
executionCost: "infinite",
totalCost: "infinite"
},
external: {
"delegate(address)": "25000"
},
internal: {
"heavyLifting()": "infinite"
}
}
},
// μΆλ ₯κ³Ό μ°κ΄λ eWASMμ
λλ€.
ewasm: {
// S-expressions νμμ
λλ€.
wast: "",
// Binary format (hex string)
// λ°μ΄λ리 νμ (hex string)
wasm: ""
}
}
}
}
}
- "JSONError" : JSON μ λ ₯μ μꡬλ νμμ μΌμΉνμ§ μμ΅λλ€. μμ) μ λ ₯μ΄ json μ€λΈμ νΈκ° μλλλ€. κ·Έ μΈμ΄λ μ§μλμ§ μμ΅λλ€. λ±.
- "IOError" : IOμ μν¬νΈ κ³Όμ μμμ μλ¬λ€μ λλ€, λΆμλ μ μλ URLμ΄λ 곡κΈλ μμ€μμμ ν΄μ λΆμΌμΉμ κ°μκ²λ€μ΄ μμ΅λλ€.
- "ParserError" : μμ€μ½λλ μΈμ΄ μμΉμ μΌμΉνμ§ μμ΅λλ€.
- "DocstringParsingError" : 컀맨λ λΈλ‘μμ NatSpec νκ·Έλ λΆμλ μ μμ΅λλ€.
- "SyntaxError" : Syntactical errorλ "continue"κ° "for" λ°λ³΅ μΈλΆμμ μ¬μ© λλκ²λ±μ΄ μμ΅λλ€.
- "DeclarationError" : μ ν¨νμ§ μκ±°λ νΉμ μκ²° ν μ μλ(unresolvable), μλ³μ μ΄λ¦μΆ©λμ λλ€. μμ "identifier not found" μλ³μκ° λ°κ²¬λμ§ μμ
- "TypeError" : μ ν¨νμ§ μμ νμ λ³κ²½, μ ν¨νμ§ μμ ν λΉ(assignment) λ±κ³Ό κ°μ type systemλ΄μ μλ¬μ λλ€.
- "UnimplementedFeatureError" : κΈ°λ₯μ΄ μ»΄νμΌλ¬μ μν΄ μ§μλμ§ μμ΅λλ€. νμ§λ§ λ―Έλ λ²μ μμλ μ§μλ κ²μΌλ‘ μμλ©λλ€.
- "internalCompilerError" : μ»΄νμΌλ¬μ μν΄ μ΄λ°λλ λ΄λΆμ λ²κ·Έ - μ΄κ²μ λ¬Έμ λ‘μ λ³΄κ³ λμ΄μ ΈμΌ ν©λλ€.
- "Exception" : μ»΄νμΌλ¬ λμ€μ μλ €μ§μ§ μμ μ€ν¨ - μ΄κ²μ λ¬Έμ λ‘μ λ³΄κ³ λμ΄μΌ ν©λλ€.
- "CompilerError" : μ ν¨νμ§ μμ μ»΄νμΌλ¬ μ€νμ μ¬μ© - μ΄κ²μ λ¬Έμ λ‘μ λμ΄μΌ ν©λλ€.
- "FatalError" : μΉλͺ μ μ€λ₯κ° λ°λ₯΄κ² μ²λ¦¬λμ§ μμ - μ΄λ λ¬Έμ λ‘μ κΈ°λ‘λμ΄μΌ ν©λλ€.
- "Warning" : λ¨μ κ²½κ³ , μ»΄νμΌλ¬λ₯Ό μ€λ¨ νμ§λ μμ§λ§, κ°λ₯νλ€λ©΄ λ€λ€μ ΈμΌ ν©λλ€.