如何使用松露框架与Node中的以太坊智能合约进行交互?

时间:2018-12-18 12:07:41

标签: node.js ethereum truffle

如何从节点与我的智能合约进行交互?我正在使用松露将合同部署到我的私人连锁店。但是我的nodejs代码没有得到部署合同的实例。

我有一个看起来像这样的小合同

pragma solidity ^0.5.1;
contract MyContract {
 uint num;
 function someFunction(uint _num) public {
   num = _num;
 }
}

然后我将合同编译并迁移到我的私有链(ganache-cli)

>truffle compile
...
>truffle migrate
...

2_deploy_contracts.js
=====================

   Deploying 'MyContract'
   ----------------------
   > transaction hash:    0xa9161613e7c398c5425b3bb7c306d494a657193c965203902c5732192b394979
   > Blocks: 0            Seconds: 0
   > contract address:    0x93Da9d36ECcd5eeceBe9b469A65cBbA397b6c85E
   > account:             0x9576316A79287D03c92F9157056e5BCde1cAEc5C
   > balance:             99.99152546
   > gas used:            98463
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00196926 ETH

MyContract Address: 0x93Da9d36ECcd5eeceBe9b469A65cBbA397b6c85E

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00196926 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.00763398 ETH
>

这么久一切似乎都很好。但是,然后我想与我的私人链上的合同进行互动。因此,我正在使用此代码:

const path = require('path');
var MyContractABI = require(path.join(__dirname, '../build/contracts/MyContract'))
var Web3 = require('web3');
var provider = new Web3.providers.HttpProvider("http://localhost:8545");
var contract = require("truffle-contract");

var MyContract = contract(MyContractABI);
MyContract.setProvider(provider);

var deployed;
MyContract.deployed().then(function(instance) {
  var deployed = instance;
  return instance.someFunction(5);
}).then(function(result) {
  // Do something with the result or continue with more transactions.
  console.log(result);
});

但这是当一切都崩溃的时候。 MyContractABI包含合同jsons接口。但是我收到一个“ UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性'apply'”。在MyContract.deployed()上失败。

节点版本:v8.11.3 松露版本:v5.0.0-beta.2

示例代码在这里: https://github.com/manmountain/truffle-example

完整堆栈跟踪

  

(节点:5888)UnhandledPromiseRejectionWarning:TypeError:无法读取   未定义的属性“应用”       在Provider.sendAsync(C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ contract.js:24:36)       在RequestManager.sendAsync(C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ node_modules \ web3 \ lib \ web3 \ requestmanager.js:80:19)       在Object.get [作为getNetwork]处(C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ node_modules \ web3 \ lib \ web3 \ property.js:116:33)       在C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ contract.js:512:27       在新的Promise()       在Function.detectNetwork(C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ contract.js:503:14)       在Function.deployed(C:\ Users \ goran \ Documents \ development \ truffle-example \ node_modules \ truffle-contract \ contract.js:451:19)       在对象。 (C:\ Users \ goran \ Documents \ development \ truffle-example \ example \ example.js:11:12)       在Module._compile(module.js:652:30)       在Object.Module._extensions..js(module.js:663:10)       在Module.load(module.js:565:32)       在tryModuleLoad(module.js:505:12)       在Function.Module._load(module.js:497:3)       在Function.Module.runMain(module.js:693:10)       在启动时(bootstrap_node.js:191:16)       在bootstrap_node.js:612:3(node:5888)处UnhandledPromiseRejectionWarning:未处理的诺言拒绝。这个   由抛出异步函数引起的错误   没有障碍,或者拒绝了没有处理的承诺   使用.catch()。 (拒绝ID:2)(节点:5888)[DEP0018]   DeprecationWarning:已弃用未处理的承诺拒绝。在   未来,未处理的承诺拒绝将终止   具有非零退出代码的Node.js进程。

1 个答案:

答案 0 :(得分:0)

由于这是您的专用网络,因此您需要指定松露控制台中的网络-network testnet(给出truffle.config文件中的网络名称)。您应该能够进入松露外壳对应于您的网络。默认情况下,松露控制台将使用本地网络,即开发默认网络。