关闭

【Solidity】使用编译器

标签: Solidity智能合约区块链技术
2296人阅读 评论(0) 收藏 举报
分类:

使用编译器

使用命令行编译器

Solidity库的构建目标之一是solc,即solidity命令行编译器。 使用solc --help可以为您提供所有选项的解释。 编译器可以生成各种输出,从简单的二进制文件和通过抽象语法树(解析树)的汇编到气体使用的估计。 如果你只想编译一个文件,你可以运行它作为solc -bin sourceFile.sol,它将打印二进制文件。 在部署合同之前,请先使用solc --optimize --bin sourceFile.sol进行编译时激活优化器。 如果要获取一些更高级的solc的输出变量,最好使用solc -o outputDirectory --bin --ast --asm sourceFile.sol将其输出到单独的文件中。

命令行编译器将自动从文件系统读取导入的文件,但也可以通过以下方式使用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"; 只有在添加=/作为重映射时才可以工作。

如果重新映射有多个匹配项,则选择具有最长公用前缀的匹配项。

为了安全起见,编译器可以限制可以访问哪些目录。 允许在命令行上指定的源文件的路径(及其子目录)和重新映射定义的路径用于导入语句,但其他所有内容都被拒绝。 额外的路径(及其子目录)可以通--allow-paths /sample/path,/another/sample/path来实现。

如果您的合约使用,您会注意到字节码中包含__LibraryName ___形式的子字符串。 您可以使用solc作为链接器,这意味着它会在这些点插入库地址:

添加--libraries "Math:0x12345678901234567890 Heap:0xabcdef0123456"命令为每个库提供一个地址或将该字符串存储在一个文件(每行一个库)中,并使用--libraries fileName运行solc

如果使用选项--link调用solc,所有输入文件将被解释为上面给出的__LibraryName ____格式中的未链接二进制文件(十六进制编码),并且是原位置的(如果输入是从stdin读取的,则写入 到stdout)。 在这种情况下,除了--libraries之外的所有选项都将被忽略(包括-o)。

如果使用--standard-json选项调用solc,则会在标准输入上输入JSON输入(如下所述),并在标准输出上返回一个JSON输出。

编译器输入和输出JSON描述

这些JSON格式由编译器API使用,也可以通过solc获得。 这些都可以更改,一些字段是可选的(如所指出),但其目的仅在于向后兼容的更改。

编译器API期望使用JSON格式的输入,并以JSON格式输出输出编译结果。

输入说明

{
  // 必须: 源代码用的语言, such as "Solidity", "serpent", "lll", "assembly", etc.
  language: "Solidity",
  // 必须
  sources:
  {
    // The keys here are the "global" names of the source files,
    // imports can use other files via remappings (see below).
    "myFile.sol":
    {
      // Optional: keccak256 hash of the source file
      // It is used to verify the retrieved content if imported via URLs.
      "keccak256": "0x123...",
      // Required (unless "content" is used, see below): URL(s) to the source file.
      // 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(s) result in success, an error should be raised.
      "urls":
      [
        "bzzr://56ab...",
        "ipfs://Qma...",
        "file:///tmp/path/to/file.sol"
      ]
    },
    "mortal":
    {
      // Optional: keccak256 hash of the source file
      "keccak256": "0x234...",
      // Required (unless "urls" is used): literal contents of the source file
      "content": "contract mortal is owned { function kill() { if (msg.sender == owner) selfdestruct(owner); } }"
    }
  },
  // Optional
  settings:
  {
    // Optional: Sorted list of remappings
    remappings: [ ":g/dir" ],
    // Optional: Optimizer settings (enabled defaults to false)
    optimizer: {
      enabled: true,
      runs: 500
    },
    // Metadata settings (optional)
    metadata: {
      // Use only literal content and not URLs (false by default)
      useLiteralContent: true
    },
    // Addresses of the libraries. If not all libraries are given here, it can result in unlinked objects whose output data is different.
    libraries: {
      // The top level key is the the name of the source file where the library is used.
      // If remappings are used, this source file should match the global path after remappings were applied.
      // If this key is an empty string, that refers to a global level.
      "myFile.sol": {
        "MyLib": "0x123123..."
      }
    }
    // The following can be used to select desired outputs.
    // If this field is omitted, then the compiler loads and does type checking, but will not generate any outputs apart from errors.
    // The first level key is the file name and the second is the contract name, where empty contract name refers to the file itself,
    // while the star refers to all of the contracts.
    //
    // The available output types are as follows:
    //   abi - ABI
    //   ast - AST of all source files
    //   legacyAST - legacy AST of all source files
    //   devdoc - Developer documentation (natspec)
    //   userdoc - User documentation (natspec)
    //   metadata - Metadata
    //   ir - New assembly format before desugaring
    //   evm.assembly - New assembly format after desugaring
    //   evm.legacyAssembly - Old-style assembly format in JSON
    //   evm.bytecode.object - Bytecode object
    //   evm.bytecode.opcodes - Opcodes list
    //   evm.bytecode.sourceMap - Source mapping (useful for debugging)
    //   evm.bytecode.linkReferences - Link references (if unlinked object)
    //   evm.deployedBytecode* - Deployed bytecode (has the same options as evm.bytecode)
    //   evm.methodIdentifiers - The list of function hashes
    //   evm.gasEstimates - Function gas estimates
    //   ewasm.wast - eWASM S-expressions format (not supported atm)
    //   ewasm.wasm - eWASM binary format (not supported atm)
    //
    // Note that using a using `evm`, `evm.bytecode`, `ewasm`, etc. will select every
    // target part of that output.
    //
    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.opcodes" ]
      },
      // Enable the source map output of every single contract.
      "*": {
        "*": [ "evm.sourceMap" ]
      },
      // Enable the legacy AST output of every single file.
      "*": {
        "": [ "legacyAST" ]
      }
    }
  }
}

输出描述

{
  // Optional: not present if no errors/warnings were encountered
  errors: [
    {
      // Optional: Location within the source file.
      sourceLocation: {
        file: "sourceFile.sol",
        start: 0,
        end: 100
      ],
      // Mandatory: Error type, such as "TypeError", "InternalCompilerError", "Exception", etc
      type: "TypeError",
      // Mandatory: Component where the error originated, such as "general", "ewasm", etc.
      component: "general",
      // Mandatory ("error" or "warning")
      severity: "error",
      // Mandatory
      message: "Invalid keyword"
      // Optional: the message formatted with source location
      formattedMessage: "sourceFile.sol:100: Invalid keyword"
    }
  ],
  // This contains the file-level outputs. In can be limited/filtered by the outputSelection settings.
  sources: {
    "sourceFile.sol": {
      // Identifier (used in source maps)
      id: 1,
      // The AST object
      ast: {},
      // The legacy AST object
      legacyAST: {}
    }
  },
  // This contains the contract-level outputs. It can be limited/filtered by the outputSelection settings.
  contracts: {
    "sourceFile.sol": {
      // If the language used has no contract names, this field should equal to an empty string.
      "ContractName": {
        // The Ethereum Contract ABI. If empty, it is represented as an empty array.
        // See https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI
        abi: [],
        // See the Metadata Output documentation (serialised JSON string)
        metadata: "{...}",
        // User documentation (natspec)
        userdoc: {},
        // Developer documentation (natspec)
        devdoc: {},
        // Intermediate representation (string)
        ir: "",
        // EVM-related outputs
        evm: {
          // Assembly (string)
          assembly: "",
          // Old-style assembly (object)
          legacyAssembly: {},
          // Bytecode and related details.
          bytecode: {
            // The bytecode as a hex string.
            object: "00fe",
            // Opcodes list (string)
            opcodes: "",
            // The source mapping as a string. See the source mapping definition.
            sourceMap: "",
            // If given, this is an unlinked object.
            linkReferences: {
              "libraryFile.sol": {
                // Byte offsets into the bytecode. Linking replaces the 20 bytes located there.
                "Library1": [
                  { start: 0, length: 20 },
                  { start: 200, length: 20 }
                ]
              }
            }
          },
          // The same layout as above.
          deployedBytecode: { },
          // The list of function hashes
          methodIdentifiers: {
            "delegate(address)": "5c19a95c"
          },
          // Function gas estimates
          gasEstimates: {
            creation: {
              codeDepositCost: "420000",
              executionCost: "infinite",
              totalCost: "infinite"
            },
            external: {
              "delegate(address)": "25000"
            },
            internal: {
              "heavyLifting()": "infinite"
            }
          }
        },
        // eWASM related outputs
        ewasm: {
          // S-expressions format
          wast: "",
          // Binary format (hex string)
          wasm: ""
        }
      }
    }
  }
}
0
0
查看评论

ubuntu 14.04中solidity的安装教程

1、nodejs以及npm的安装 在nodejs官网https://nodejs.org/en/下载stable版的nodejs(集成了npm)到你的ubuntu操作系统上 解压文件找到bin目录下的node文件和npm文件使用如下命令建立软链接 ln -s 你的node路径 /usr/local...
  • lp18036194881
  • lp18036194881
  • 2017-06-03 11:47
  • 733

Solidity开发神器Remix

功能这里我们使用在线编译器,打开网址https://ethereum.github.io/browser-solidity文件夹管理最左边是文件夹管理,里面列出了当前的工作区里的文件,remix可以支持从本地文件夹读取文件。工作区正中间是工作区,工作区上半部是代码编辑区,在这里可以写solidity...
  • liaodehong
  • liaodehong
  • 2018-01-29 20:01
  • 170

『0002』 - Atom编辑器编写智能合约(Smart Contract)插件安装配置

孔壹学院:国内区块链职业教育领先品牌 作者:黎跃春,区块链、高可用架构工程师 微信:liyc1215 QQ群:348924182 博客:http://liyuechun.org 编辑器选择理论上讲任何编辑器都可以编写Solidity合约代码,比如:WebStorm,VSCode,...
  • liyuechun520
  • liyuechun520
  • 2017-10-31 21:46
  • 266

Solidity 文档--目录

Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。在后续内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。 注意 目前尝试Solidity的最好方式是使用基于浏览器的编译器(需要一点时间加载,请耐心等待)。...
  • fidelhl
  • fidelhl
  • 2016-02-22 17:12
  • 6327

学习Solidity官方文档的笔记一

极客学院翻译的中文文档链接:http://wiki.jikexueyuan.com/project/solidity-zh/对一些demo尝试用基于浏览器的编译器跑一下在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。代币的例子contract Coin { //Coi...
  • ler_123
  • ler_123
  • 2017-01-10 10:51
  • 662

Solidity 文档--第二章:安装 Solidity

安装Solidity基于浏览器的Solidity如果你只是想尝试一个使用Solidity的小合约,你不需要安装任何东西,只要访问基于浏览器的Solidity。如果你想离线使用,你可以保存页面到本地,或者从 http://github.com/chriseth/browser-solidity 克隆一...
  • wo541075754
  • wo541075754
  • 2016-11-18 15:47
  • 2601

Remix 以太坊Solidity IDE搭建与初步使用

以太坊: 因为以太坊为开源社区,虽然东西很优秀,但是组件十分的杂乱,因此首先简单介绍下以太坊的一些常用组件: 1. Geth: Geth是由以太坊基金会提供的官方客户端软件,用Go编程语言编写的。 2. Parity: Parity 是对以太坊协议的另一个很好的实现,并...
  • jerry81333
  • jerry81333
  • 2017-09-28 03:50
  • 2284

Solidity 文档--第一章:智能合约入门

一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节。 存储 contract SimpleStorage { uint storedData; function set(uint x) { storedDat...
  • fidelhl
  • fidelhl
  • 2016-02-22 17:17
  • 6766

Solidity学习(1)

1.概要Solidity是契约导向的实现智能合约的高级语言。 它受到C ++,Python和JavaScript的影响,旨在针对以太坊虚拟机(EVM)。 Solidity是静态类型的,支持继承,库和复杂的用户定义类型等功能。 Solidity可以创建投票,众筹,拍卖(盲拍),多重签名钱包等等的合...
  • sunniy27
  • sunniy27
  • 2017-11-30 20:22
  • 333

Solidity番外篇(一)Solidity在线or插件使用

在学习以太坊合约的过程中会需要自己编写智能合约,官方提供了几种方式供大家使用。下面分别简单介绍一下,如果有错误的地方,还留言指正补充。DAPP IDE说实话,这个版本IDE我还没有使用过,只提供一个连接地址供大家参考。 The-DApp-IDE 此连接中有具体的使用描述。在线编程Solidity...
  • wo541075754
  • wo541075754
  • 2016-11-18 11:13
  • 2403
    个人资料
    • 访问:649623次
    • 积分:9118
    • 等级:
    • 排名:第2456名
    • 原创:298篇
    • 转载:13篇
    • 译文:4篇
    • 评论:82条
    博客专栏
    微信订阅号
    欢迎加入QQ群
    玩家老黄历(微信小程序)
    谢谢支持~
    最新评论