使用 web3 部署智能合约时不支持同步请求

Posted

技术标签:

【中文标题】使用 web3 部署智能合约时不支持同步请求【英文标题】:Synchronous requests are not supported when deploying smart contract using web3 【发布时间】:2018-01-22 00:19:07 【问题描述】:

我正在尝试使用 Web3、Truffle 和 Testrpc 在本地部署智能合约。我使用 Truffle 编译了一个智能合约,并使用以下代码来提取 ABI 和字节码。在同一个脚本中,我正在尝试使用 web3.eth.contract.deploy 部署合约(在本文档中给出:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#deploy)但一直收到此错误:

Error: Synchronous requests are not supported

我应该怎么做才能解决这个问题?

这是供参考的脚本:

let fs = require("fs");
let Web3 = require('web3'); // https://www.npmjs.com/package/web3
var TestRPC = require("ethereumjs-testrpc");

let web3 = new Web3();
web3.setProvider(TestRPC.provider());

let source = fs.readFileSync("../SmartContracts/build/contracts/TheContract.json");
let JSONObject = JSON.parse(source);

// ABI and bytecode description as JSON structure
let abi = JSONObject.abi
let bytecode = JSONObject.unlinked_binary;

// Create Contract proxy class
let contractSettings = 
  from: addr, 
  gas: 1000000, 
  data: bytecode

let SampleContract = new web3.eth.Contract(abi, contractSettings);

let deploySettings = 
  data: bytecode,
  from: addr


SampleContract.deploy(deploySettings)
  .send(
    from: addr,
    gas: 1500000,
    gasPrice: '30000000000000'
  )
  .on('error', function(error) 
    console.log("error");
  )
  .on('transactionHash', function(transactionHash) 
    console.log("transaction hash");
  )
  .on('receipt', function(receipt)
    console.log("receipt") // contains the new contract address
  )
  .on('confirmation', function(confirmationNumber, receipt) 
    console.log("confirmation");
  )
  .then(function(newContractInstance)
    console.log(newContractInstance.options.address) // instance with the new contract address
  );

console.log("完成");

【问题讨论】:

您最终找到解决方案了吗?我也有同样的问题。 【参考方案1】:

我认为这是使用 TestRPC 作为 web3 提供者的问题。切换到本地 geth 实例似乎已经解决了这个问题。

【讨论】:

是的,我相信你是对的。我也有这个问题,我相信这只是一个版本问题。我在这里打开它:github.com/ethereum/web3.js/issues/1038

以上是关于使用 web3 部署智能合约时不支持同步请求的主要内容,如果未能解决你的问题,请参考以下文章

Web3js - 部署后立即返回智能合约地址

Web3 开发系列教程—创建你的第一个智能合约部署第一个智能合约

nodejs部署智能合约的方法-web3 0.20版本

部署智能合约时出现节点错误 - Web3.js

Python Web3 开发:用 Brownie 部署智能合约

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)