Py-Solc и импорт солидности - PullRequest
0 голосов
/ 08 мая 2018

Как я могу скомпилировать файлы солидности, которые выполняют относительный импорт через py-solc? Вот минимальный пример:

Структура каталогов

my-project
   - main.py
   - bar.sol
   - baz.sol

main.py:

from solc import compile_source

def get_contract_source(file_name):
    with open(file_name) as f:
        return f.read()

contract_source_code = get_contract_source("bar.sol")

compiled_sol = compile_source(contract_source_code)  # Compiled source code

baz.sol:

pragma solidity ^0.4.0;

contract baz {
    function baz(){

    }
}

bar.sol:

pragma solidity ^0.4.0;

import "./baz" as baz;

contract bar {
    function bar(){

    }
}

Когда я пытаюсь запустить файл python, я получаю следующую ошибку:

solc.exceptions.SolcError: An error occurred during execution
        > command: `solc --combined-json abi,asm,ast,bin,bin-runtime,clone-bin,devdoc,interface,opcodes,userdoc`
        > return code: `1`
        > stderr:

        > stdout:
        :17:1: Error: Source "baz" not found: File outside of allowed directories.
import "./baz" as baz;
^----------------------^

Мне все еще не ясно, как работает импорт. Я просмотрел документы , и мне кажется, что мне нужно передать дополнительные аргументы команде compile_source. Я нашел здесь несколько потенциально полезных документов и думаю, что мне нужно поиграться с allow_paths или compile_files, что я и сделаю. Если я найду решение до того, как получу ответ, я опубликую то, что найду.

1 Ответ

0 голосов
/ 08 мая 2018

Хорошо, получается, compile_files это именно то, что мне нужно.

Новая команда компиляции:

import os

PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
compiled_sol = compile_files([os.path.join(self.PROJECT_ROOT, "bar.sol"), os.path.join(self.PROJECT_ROOT, "baz.sol")])

и оказывается, что мой импорт был неверным. Мне нужно импортировать baz как import "./baz.sol" as baz; - мне не хватало расширения .sol.

...