Solidity
使用 web3 提供程序時函式不返回地址
我有一份僅在使用混音時可以正常工作的契約。我需要測試塊大小和塊號。這裡有人建議我使用我做過的 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。由客戶負責觀察要探勘的交易,然後觀察發生了什麼,因為地址就在哪裡。
您的問題有一系列令人困惑的方法。
- Truffle 框架有一個複雜的遷移系統,可以跟踪它為你部署的合約的地址。假設您這樣做了
truffle migrate
,並且您的遷移腳本也這樣做了deployer.deploy(DepositPaying)
,那麼您可以方便地獲取實例instance = DepositPaying.deployed()
和地址instance.address
。如果您希望部署契約的一個實例,這非常有用。- 您可以使用 Web3 API 來部署和
.on('receipt
) 在收據可用時觸發回調(更像是一個承諾)(因為它是被探勘的)和類似getTransactionReceipt(txnHash)的東西,其中包括已部署合約的地址(如果有),來自您的交易。- 您可以使用契約工廠模式自行跟踪。使用契約工廠有優勢。您可以維護工廠創建的所有地址的索引,使其易於檢查,使用訪問控制,以便您的合約只與其他“受信任的”合約對話並發出事件。如果你的工廠發出事件,那麼前端可以只監聽合約創建事件。
考慮:
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 的原因是它通過抽象掉一些血腥細節來“幫助”。交易或多或少會立即探勘,它會為您獲取收據並給出響應,因為前端已經盡職盡責地處理了所有這些內容。這些功能使得迭代合約程式碼的效率更高,看看它做了什麼並把它做對了,但是當你在沒有訓練輪的情況下轉向前端工作時,它會產生一種錯誤的簡單感。
希望能幫助到你。