Solidity - 将JSON描述转换为Solidity代码

10

我希望编译我的以太坊 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组成,需要编译器标准输入和输出JSON。"

(链接) 标准输入JSON看起来像是JSON和这个solidity代码的组合。所以我的问题是 -
如何将Solidity合同代码转换为编译器标准输入JSON?
难道这是编译合同的唯一方法吗?

3个回答

11

这段代码对我有效,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)
}

你好世界.sol

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

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

谢谢。这基本上就是我想做的,但有没有一种方法可以自动创建输入内容的内容?类似于solc.CreateJSON(CONTRACT_FILE)这样的东西? - Banana Cake
嘿,也许你能给些建议?const appPath = path.resolve(__dirname, 'contracts', 'inbox.sol'); const source = fs.readFileSync(appPath, 'utf8').toString(); 以非常相似的方式获取文件,但出现了“指定的输入源无效”的错误。 - user1935987
你在传递文件之前会修改它的内容吗? - user1935987
1
尝试使用 const appPath = path.resolve(__dirname, './contracts/inbox.sol');,并且可能需要在 fs.readFileSync() 中删除 ''utf8''。我没有修改 content - Yegor Zaremba
1
好的,我明白了。你忘记在你的回答中包含JSON键“content”,而我在文档中也忽略了它。它必须是:[CONTRACT_FILE]: { content: content } - user1935987
显示剩余3条评论

4

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

solc --standard-json   -o outputDirectory --bin --ast --asm HelloWorld.sol

以上命令中,--standard-json 期望输入一个json文件,你可以提供一个。

您可以在以下链接中找到如何编写输入文件的示例。

来源:https://solidity.readthedocs.io/en/v0.4.24/using-the-compiler.html


0
const solc = require("solc");

// file system - read and write files to your computer
const fs = require("fs");

// reading the file contents of the smart  contract
const fileContent = fs.readFileSync("HelloWorld.sol").toString();

// create an input structure for my solidity compiler
var input = {
  language: "Solidity",
  sources: {
    "HelloWorld.sol": {
      content: fileContent,
    },
  },

  settings: {
    outputSelection: {
      "*": {
        "*": ["*"],
      },
    },
  },
};

var output = JSON.parse(solc.compile(JSON.stringify(input)));
// console.log("Output: ", output);

const ABI = output.contracts["HelloWorld.sol"]["Demo"].abi;
const byteCode = output.contracts["HelloWorld.sol"]["Demo"].evm.bytecode.object;

// console.log("abi: ",ABI)
// console.log("byte code: ",byteCode)

npm run yorfilename.js

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接