Npm Solidity-输入JSON描述的Solidity代码

Npm Solidity-输入JSON描述的Solidity代码,npm,ethereum,solidity,smartcontracts,Npm,Ethereum,Solidity,Smartcontracts,我想编译我的以太坊HelloWorld.sol智能合约。在所有教程中,您都是这样做的: var solc = require('solc'); var compiledContract = solc.compile(fs.readFileSync('HelloWorld.sol').toString(); 其中HelloWorld.sol是: pragma solidity ^0.5.1; contract HelloWorld { bytes32 message; cons

我想编译我的以太坊HelloWorld.sol智能合约。在所有教程中,您都是这样做的:

var solc = require('solc');
var compiledContract = solc.compile(fs.readFileSync('HelloWorld.sol').toString();
其中HelloWorld.sol是:

pragma solidity ^0.5.1;

contract HelloWorld {
    bytes32 message;
    constructor(bytes32 myMessage) public {
        message = myMessage;
    }

    function getMessage() public view returns(bytes32){
        return message;
    }
}
换句话说,我将原始的Solidity契约代码放入solc.compile()方法中。但是这个过程在
compiledContract
中给了我这个错误:

'{"errors":[{"component":"general","formattedMessage":"* Line 1, Column 1\\n  Syntax error: value, object or array expected.\\n* Line 1, Column 2\\n  Extra non-whitespace after JSON value.\\n","message":"* Line 1, Column 1\\n  Syntax error: value, object or array expected.\\n* Line 1, Column 2\\n  Extra non-whitespace after JSON value.\\n","severity":"error","type":"JSONError"}]}'
我一直在寻找解决方案,但我唯一发现的是

高级API由一个方法compile组成,compile 需要编译器标准输入和输出JSON。”

()。标准输入JSON看起来像是JSON和这个稳定代码的某种组合。所以我的问题是-
如何将solidity契约代码转换为编译器标准输入JSON?

这是编译合同的唯一方法,对吗?

这段代码适合我,index.js

const solc = require('solc')
const fs = require('fs')

const CONTRACT_FILE = 'HelloWorld.sol'

const content = fs.readFileSync(CONTRACT_FILE).toString()

const input = {
  language: 'Solidity',
  sources: {
    [CONTRACT_FILE]: {
      content: content
    }
  },
  settings: {
    outputSelection: {
      '*': {
        '*': ['*']
      }
    }
  }
}

const output = JSON.parse(solc.compile(JSON.stringify(input)))

for (const contractName in output.contracts[CONTRACT_FILE]) {
  console.log(output.contracts[CONTRACT_FILE][contractName].evm.bytecode.object)
}
HelloWorld.sol

contract HelloWorld {
    bytes32 message;
    constructor(bytes32 myMessage) public {
        message = myMessage;
    }

    function getMessage() public view returns(bytes32){
        return message;
    }
}

或者,您可以使用下面的命令和输入数据运行solc(命令行工具)

solc --standard-json   -o outputDirectory --bin --ast --asm HelloWorld.sol
在上面的命令when--standard json中,Where需要一个您可以提供的输入json文件

您可以在下面的链接中找到输入文件的示例


来源:

谢谢。这基本上就是我想要做的,但是有没有办法,如何自动创建输入的内容?类似于solc.CreateJSON(合同文件)的东西?嘿,也许你可以建议
const-appPath=path.resolve(_-dirname,'contracts','inbox.sol')
const source=fs.readFileSync(appPath,'utf8').toString()
以非常相似的方式获取文件,但指定了
无效的输入源
错误在将内容文件传递到此处之前,您是否修改了内容文件?请尝试
const appPath=path.resolve(uu dirname,'./contracts/inbox.sol')
并可能删除
fs.readFileSync()
中的
“utf8”
。我没有修改
内容
好的,我知道了,你忘了在你的答案中包含json键
内容
,我在文档中忽略了它。它必须是:
[合同文件]:{content:content}