如何编译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
假设我们有一个智能合约man.sol,它在一个文件中包含两个合约,如下所示:
pragma solidity ^0.8.0;
import "./SafeERC20.sol";
contract mainContract {
... (Any code can be here ...)
}contract childContract {
... (Other code here)}
所以我们有一个这样的目录:
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)
好吧,事实证明< 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布局有一个相当简单的教程。左固定列和流体含量列,具有页眉和页脚以及相等的列高。 问题答案: 试试这个动态驱动器布局及其亲戚(我是通过类似的问题向我指出的)。