当前位置: 首页 > 知识库问答 >
问题:

进口固体和固体

慕阳
2023-03-14

如何编译solidity文件,通过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;
^----------------------^

我仍然不是100%清楚进口是如何运作的。我已经查看了文档,似乎需要向<code>compile_source

共有2个答案

孟子墨
2023-03-14

假设我们有一个智能合约man.sol,它在一个文件中包含两个合约,如下所示:

pragma solidity ^0.8.0;
import "./SafeERC20.sol";
contract mainContract {
  ... (Any code can be here ...)
}contract childContract {
 ... (Other code here)}

所以我们有一个这样的目录:

  • 主要。sol-SafeERC20.sol-deploy.py

Deploy.py:

import json
import os

import web3.eth
from web3 import Web3, HTTPProvider

from solcx import install_solc, set_solc_version,compile_standard
from dotenv import load_dotenv#here install solidity version
install_solc('v0.8.0')
set_solc_version('v0.8.0')


file_path = "."
name = "main.sol"
input = {
    'language': 'Solidity',
    'sources': {
        name: {'urls': [file_path + "/" + name]}},
    'settings': {
        'outputSelection': {
            '*': {
                '*': ["abi", "metadata", "evm.bytecode", "evm.bytecode.sourceMap"],
            },
            'def': {name: ["abi", "evm.bytecode.opcodes"]},
        }
    }
}

output = compile_standard(input, allow_paths=file_path)

contracts = output["contracts"]

with open('compiled_code.json', "w") as file:
    json.dump(output, file)

bytecode = contracts["SC-.sol"]["mainContract"]["evm"]["bytecode"]["object"]

abi = contracts["main.sol"]["mainContract"]["abi"]


# Deploy on local ganache# w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:7545"))
# chainId = 1337
# myAddress = "0x6235207DE426B0E3739529F1c53c14aaA271D..."
# privateKey = "0xdbe7f5a9c95ea2df023ad9......."

#Deploy on rinkeby infura rinkebyw3 = Web3(Web3.HTTPProvider("https://rinkeby.infura.io/v3/......"))
chainId = 4

myAddress = "0xBa842323C4747609CeCEd164d61896d2Cf4..."
privateKey ="0x99de2de028a52668d3e94a00d47c4500db0afed3fe8e40..."

SCOnline = w3.eth.contract(abi=abi, bytecode=bytecode)

nonce = w3.eth.getTransactionCount(myAddress)

transaction = SCOnline.constructor().buildTransaction({
    "gasPrice": w3.eth.gas_price, "chainId": chainId, "from": myAddress, "nonce": nonce
})

signedTrx = w3.eth.account.sign_transaction(transaction, private_key= privateKey)



txHash = w3.eth.send_raw_transaction(signedTrx.rawTransaction)

txReceipt = w3.eth.wait_for_transaction_receipt(txHash)
邴修远
2023-03-14

好吧,事实证明< code>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")])

结果证明我的进口是错误的。我需要像导入< code >一样导入< code>baz。/baz.sol "作为baz -我漏掉了< code >。sol扩展。

 类似资料:
  • 固体对象 现在你懂得了在3D空间的一些图层布局的基础,我们来试着创建一个固态的3D对象(实际上是一个技术上所谓的空洞对象,但它以固态呈现)。我们用六个独立的视图来构建一个立方体的各个面。 在这个例子中,我们用Interface Builder来构建立方体的面(图5.19),我们当然可以用代码来写,但是用Interface Builder的好处是可以方便的在每一个面上添加子视图。记住这些面仅仅是包含

  • 问题内容: 我正在尝试使用bootstrap 3表制作具有固定标题和可滚动内容的表。不幸的是,我发现的解决方案不适用于引导程序或使样式混乱。 这里有一个简单的引导表,但是由于某种原因我不知道tbody的高度不是10px。 例: 问题答案: 这是有效的解决方案:

  • 我有一系列冰的图像,我想通过分析来确定固体和液体的面积。这里有一个示例图像。这类似于孔隙率测量,但由于颜色太相似,无法简单地进行阈值测量,因此我很难进行测量。 目前,我不得不玩弄对比/寻找边缘/去斑/制作二进制文件,以使晶体更容易识别。 然后我通过形态分割:例子和阈值来计算区域。 有没有更简单的方法来计算冰的面积和空间/液体的面积,而不必追踪每一个晶体?

  • 问题内容: 我已经有一段时间了,这似乎是一个Chrome重绘错误,尚未修复。因此,我正在寻找任何权宜之计。 主要问题是页面上的元素具有使用以下内容的背景图像时: 如果另一个元素固定并具有子视频元素,则它将导致具有背景图像的元素消失。 现在,它可以在Safari(以及Firefox和IE)中正常运行,因此这并不是Webkit的问题。我已经应用了一些没有用的建议属性。 目前,我的解决方案只是通过媒体查

  • 我有4列网格窗格(fixed1,liquid,fixed2,liquide)。每个液柱的宽度必须为=(gridpane width-fixed1-fixed2)/2。换句话说,是液柱宽度的50%。重要提示:所有宽度=液体宽度固定宽度。为了设置列约束,我找到了以下代码: 但是,此代码设置的不是液体宽度的百分比,而是所有宽度的百分比。怎么做?

  • 问题内容: 我想知道这里是否有人对下面的两栏css布局有一个相当简单的教程。左固定列和流体含量列,具有页眉和页脚以及相等的列高。 问题答案: 试试这个动态驱动器布局及其亲戚(我是通过类似的问题向我指出的)。