Solidity

使用 web3 提供程序時函式不返回地址

  • August 6, 2020

我有一份僅在使用混音時可以正常工作的契約。我需要測試塊大小和塊號。這裡有人建議我使用我做過的 ganache,但現在我沒有得到我應該在這個函式中得到的輸出:

function promiseRentalCompleting() public
        atCFact(C_facts.Requested)
        onlyBy(initiator)
        transitionNext(true)
        returns (address){
            rental.car=rental.carGroup.freeCars[0];
            DepositPaying depositPaying = new DepositPaying(address(this));
            return address(depositPaying);
        }

基本上我需要這個函式來給我一個地址,我將在其中部署 DepositPaying 合約,但是在 remix 的解碼輸出是空的,這在我添加 ganache 之前沒有發生。我應該做一些不同的事情來適應 web3 提供商嗎?

(在瀏覽器 chrome 上使用 remix,從這裡得到 ganache ,不使用 de 命令行)

你忽略了採礦步驟。

合約部署是一筆交易的*結果,但首先要探勘一筆交易。*在此期間,發送交易的第一個響應new DepositPaying(address(this))是交易雜湊。

該響應並不表示交易已處理。只是它被發送並分配了一個 UID。交易雜湊不會告訴您有關地址的任何資訊 - 只是您感興趣的交易 id。由客戶負責觀察要探勘的交易,然後觀察發生了什麼,因為地址就在哪裡。

您的問題有一系列令人困惑的方法。

  1. Truffle 框架有一個複雜的遷移系統,可以跟踪它為你部署的合約的地址。假設您這樣做了truffle migrate,並且您的遷移腳本也這樣做了deployer.deploy(DepositPaying),那麼您可以方便地獲取實例instance = DepositPaying.deployed()和地址instance.address。如果您希望部署契約的一個實例,這非常有用。
  2. 您可以使用 Web3 API 來部署和.on('receipt) 在收據可用時觸發回調(更像是一個承諾)(因為它是被探勘的)和類似getTransactionReceipt(txnHash)的東西,其中包括已部署合約的地址(如果有),來自您的交易。
  3. 您可以使用契約工廠模式自行跟踪。使用契約工廠有優勢。您可以維護工廠創建的所有地址的索引,使其易於檢查,使用訪問控制,以便您的合約只與其他“受信任的”合約對話並發出事件。如果你的工廠發出事件,那麼前端可以只監聽合約創建事件。

考慮:

contract DepositPaying {
...
}

contract Factory {

 address[] public deployed;

 event Deployed(address newContract);

 function deployDepositPaying() public returns(address addr) {
   addr = new DepositPaying(msg.sender);
   deployed.push(addr);
   emit Deployed(addr);
 }

關於工廠模式的一些闡述:https ://web3js.readthedocs.io/en/v1.2.11/web3-eth.html?highlight=contract%20address#gettransactionreceipt

混音

這一切似乎都適用於 Remix 的原因是它通過抽象掉一些血腥細節來“幫助”。交易或多或少會立即探勘,它會為您獲取收據並給出響應,因為前端已經盡職盡責地處理了所有這些內容。這些功能使得迭代合約程式碼的效率更高,看看它做了什麼並把它做對了,但是當你在沒有訓練輪的情況下轉向前端工作時,它會產生一種錯誤的簡單感。

希望能幫助到你。

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