Ethereum-Classic
如何使用通過Nodejs成功探勘的智能合約
我能夠通過 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; } }
- 創建節點 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