Solidity 合約需要另一個合約的地址
Solidity 合約有沒有辦法以程式方式找出另一個 Solidity 合約的地址?
現在,我通過將 的地址硬編碼到 的建構子中來
Contract A
告知,如下所示:Contract B``B``A
BContract = MyNFT721(0xA8978c16E9640508947A93B4Df5b49c8740B752D);
但是每次我對它進行編輯/更新時,
B
我都必須重新部署它,這意味著它會獲得一個新地址——然後A
就再也找不到它了。如果
A
能夠以程式方式找到新更新的地址,那就太好了B
,因為現在我必須單獨部署它們,B
首先部署,然後獲取它的新地址,然後將這個新地址硬編碼到A
.,然後重新部署A
.它有點瘋狂。
(順便說一下,ABI 也是一樣的:每次我進行更新時,我都必須將新的 ABI 複製粘貼到呼叫合約的程式碼中……)
=======================
更新:
我採用了遷移方法——但根據過去的經驗,我不建議將它部署到主網。我只記得它一直在出錯。我認為這與區塊被批准/開採所需的時間有關。
請記住,必須首先部署契約 1,此時其地址變得已知且可用 - 然後可以傳遞到契約 2,這是要部署的遷移文件中的下一個契約。
所以它們基本上是相互連結的。
但是如果第一次部署超時 - 或者其他任何問題或“太長”,第二次。部署將遭受/失敗。
因此,儘管此解決方案適用於開發 - 意味著將合約本地部署到 Ganache,但它在實時 MainNet 部署中對我不起作用。
但我認為,當您進入最後一個“主網”階段(甚至
Ropsten
或Rinkeby
)時——在本地徹底測試完所有內容後,你就可以手動進行部署,一次一個契約——並且一切順利。
是和不是。
沒有幫助,它是無法發現它的。可能最常見的方法是將此資訊傳遞給建構子,如下所示:
contract MyNFT721 { ... } contract BContract { MyNFT721 myNft; constructor(address nft) public { myNFT721 = MyNFT721(nft); } }
您還可以設置連結契約的定期更改:
在 MyNFT721 中:
b契約 b契約;
function changeBContract(address newB) public onlyOwner { bContract = BContract(newB);
您還可以使用 truffle 遷移腳本協調部署,以便在創建
MyNFT721
時將部署的地址傳遞到部署事務BContract
中。大致 …
... deployer.deploy(MyNFT721) .then(function() { deployer.deploy(BContract, MyNFT721.deployed().address); ...
如果需要時不時
MyNFT721
知道new在哪裡,那麼腳本可以進行:BContract
var myNft; MyNFT721.deployed().then(function(instance) { myNFT = instance; myNFT.changeBContract(BContract.deployed()); // you have to add this function ...
我喜歡通過讓客戶確認地址確實是預期的契約類型來檢查是否存在明顯的疏忽。這是一個粗略的檢查:
在 MyNFT721 中:
function isMyNFT721() public pure returns(bool isIndeed) {return true;}
在 B 契約中:
constructor(address nft) public { myNFT721 = MyNFT721(nft); require(myNFT721.isMyNFT721()); }
冒名頂替者模仿我們應該是唯一進行部署的人並非不可能。這足以擷取我們錯過它
address(0)
的情況 ( ) 或我們提供了地址但它不是它應該是的契約的情況。希望能幫助到你。