Web3js

如何部署和呼叫合約?事先需要地址嗎?

  • August 23, 2018

我想將 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 可以多次部署到區塊鏈。已部署合約的每個實例都有一個唯一的地址。

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