npm Solidity -用于输入JSON描述的Solidity代码

2jcobegt  于 2023-02-13  发布在  其他
关注(0)|答案(3)|浏览(142)

我想编译我的以太坊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?
我说这是编写合同的唯一方法,对吗?

s3fp2yjn

s3fp2yjn1#

这段代码对我很有效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;
    }
}
kuarbcqp

kuarbcqp2#

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

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

在上面的命令中,when--standard-json期望您可以提供一个输入json文件。
你可以在下面的链接中找到一个输入文件应该是什么样的例子。
来源:https://solidity.readthedocs.io/en/v0.4.24/using-the-compiler.html

raogr8fs

raogr8fs3#

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

相关问题