Ethereum-Classic

如何使用通過Nodejs成功探勘的智能合約

  • September 7, 2016

我能夠通過 NodeJs 成功探勘一份簡單的合約。但不知道如何在另一個 nodeJs 文件或 geth 伺服器中使用該合約探勘地址。下面是我遵循的步驟

1)啟動geth伺服器為 geth --dev --rpc --rpcaddr "10.203.60.97" --rpcport "8046" --rpccorsdomain "*" --datadir "./data_2" --port "30303" --maxpeers 4 --unlock "0" --ipcpath "C:\\Block_Chain\\Eth_2\\data_2\\geth.ipc" console

契約:

合約測試{
uint testVal;
功能測試(uint testValue){
測試值 = 測試值;
}
函式乘法(uint a)返回(uint d){
返回一個* 7 * testVal;
}
}
  1. 創建節點 js 文件 ethereum.js 文件
var Web3 = 需要 ('web3');
var web3 = 新的 Web3 ();
var 犁溝​​ = 要求 ('犁溝');
web3.setProvider(new web3.providers.HttpProvider('http://10.203.60.97:8046/'));

var input = '合約TestMultiply {uint testVal; 函式測試 (uint testValue) {testVal = testValue;} 函式乘法 (uint a) 返回 (uint d) {return a * 7 * testVal; }}';

var output = solc.compile(input, 1);

for (var contractName in output.contracts) {
var byteCode = output.contracts[contractName].bytecode;
var abi = JSON.parse(output.contracts[contractName].interface);
var myContract = web3.eth.contract(abi);
變數測試值 = 30;
var multiplyContract = myContract.new(
測試值,
{
來自:web3.eth.accounts[0],
數據:字節碼,
氣體:4700000
},函式(e,合約){
如果(!e){
if(!contract.address) {
console.log("合約交易發送:TransactionHash: " + contract.transactionHash + " 等待被挖...");
} 別的 {
console.log("合約探勘!地址:" + contract.address);
console.log(multiplyContract);
console.log('Multiply Val ' + multiplyContract.multiply.call(10));
}
}
別的{
console.log("發生錯誤");
控制台.log(e);
}
});
console.log("列印合約:" + multiplyContract);
}

3)在node js中執行js文件

C:\Block_Chain\Node_js>node ethereum.js
列印契約:[object Object]
合約交易發送:TransactionHash: 0x852d568a21fbea5f7e09e96d1b5a2fd977a3ea91bf5d9f2709899d7247e90e4f 等待被挖...
合約開採!地址:0xf98c996940904c994694df2bc7a5810d455a519a

4)嘗試在geth伺服器中使用契約它給出了錯誤

multiplyContract.multiply.call(10))
ReferenceError:multiplyContract 未定義

如果我嘗試使用另一個 js 文件來使用這個契約,它會根據我的契約函式返回 0 值而不是 2100。

測試.js:

var Web3 = 需要 ('web3');
var web3 = 新的 Web3 ();
web3.setProvider(new web3.providers.HttpProvider('http://10.203.60.97:8046/'));
var mylTest= web3.eth.contract([{"constant":false,"inputs":[{"name":"testValue","type":"uint256"}],"name":"Test","輸出":[],"type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name": "multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]).at('0xf98c996940904c994694df2bc7a5810d455a519a');

console.log('乘法值' + mylTest.multiply.call(10)); --> 返回 0

您能否調查一下問題並提供幫助

任何幫助將不勝感激。我做錯了什麼。

  • 當您從 Node 執行部署時,並不意味著 Geth 控制台會自動了解此合約。你必須告訴它這個新契約。以類似於您對 Node 所做的方式:
var myContract = web3.eth.contract(abi);
var myContractInstance = myContract.at("0xf98c996940904c994694df2bc7a5810d455a519a");
  • 更改您的契約以testVal公開喜歡uint public testVal;。然後在 Test.js 中:
console.log('testVal' + mylTest.testVal().toString(10)); // 確認值正確
console.log('乘法值' + mylTest.multiply.call(10).toString(10)); // 注意 toString

引用自:https://ethereum.stackexchange.com/questions/8561