Web3js
如何部署和呼叫合約?事先需要地址嗎?
我想將 node.js 中腳本中的字元串儲存到區塊鏈。這是契約。
pragma solidity ^0.4.0; contract SimpleStorage { string storedData; function set(string x) { storedData = x; } function get() constant returns (string) { return storedData; } }
為了在網路上部署契約(在我的情況下為 testnet),我需要創建契約的一個實例。為了創建一個實例並部署它,我需要三樣東西:web3 庫、abi 和合約地址:
var Web3 = require('web3'); var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); abi = JSON.parse(....) //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2) StoreContract = web3.eth.contract(abi); contractInstance = VotingContract.at('CONTRACT ADDRESS'); //And now I can use contract function contractInstance.set(string data)
所以我的問題是……我如何獲得合約地址???
您需要地址和 ABI 來呼叫合約。在呼叫合約之前,您需要部署它。你只有 abi 定義。您需要通過讓合約被探勘並獲取地址來部署合約。採用,
var simpleStorage = StoreContract.new(your_parameters ,{from:web3.eth.accounts[0], data: compiled_code , gas: gas_amount}, call_back_function)
一旦合約被探勘出來,它會返回這樣的東西,
Contract mined! address: contract_address
您可以在 contract_address 找到合約地址
有關從智能合約開始的詳細說明,請參閱乙太坊網站中提供的基本歡迎程序範例。
更新-1:
如果你仔細閱讀你提到的部落格文章,很明顯你需要發送一個交易來部署合約。(它也有一些漂亮的圖表)
這是部落格文章中的程式碼片段,
abiDefinition = JSON.parse(compiledCode.contracts[':Voting'].interface) VotingContract = web3.eth.contract(abiDefinition) byteCode = compiledCode.contracts[':Voting'].bytecode // the following line is what you need to do get the address deployedContract = VotingContract.new(['Rama','Nick','Jose'],{data: byteCode, from: web3.eth.accounts[0], gas: 4700000}) deployedContract.address contractInstance = VotingContract.at(deployedContract.address)
從你發布的內容來看,
var Web3 = require('web3'); var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); abi = JSON.parse(....) //==> I got abi following this tutorial(https://medium.com/@mvmurthy/full-stack-hello-world-voting-ethereum-dapp-tutorial-part-1-40d2d0d807c2) //at this point you need to send the transaction using "StoredContract.new(params,transaction details, callback[optional]);" StoreContract = web3.eth.contract(abi); contractInstance = VotingContract.at('CONTRACT ADDRESS');
您不需要地址來部署合約,您只需要發送帶有合約詳細資訊的交易。一旦合約被部署(在交易被探勘之後),它將輸出您可以用來呼叫特定實例的地址。
更新2:
您可以通過發送交易部署同一合約的多個實例,並將它們儲存在不同的地址。您可以使用相應地址的特定實例(例如:在您的情況下呼叫像 setter 這樣的函式)。請參閱此處發布的以下答案。
就像程式碼可以是原始碼形式,或者轉換/編譯為可執行形式一樣,同樣的事情也適用於合約。
從原始碼可以生成許多可執行形式的副本。
在原始碼形式中,Solidity 中的合約就像 OOP 術語中的一個類:它可以被實例化多次,並且可以被繼承。
使合約可執行,通常涉及 2 個步驟:
將原始碼轉換為乙太坊虛擬機 (EVM) 字節碼 將 EVM 部署到乙太坊區塊鏈 相同的合約原始碼或 EVM 可以多次部署到區塊鏈。已部署合約的每個實例都有一個唯一的地址。