Remix IDE を使用してイーサリアム スマート コントラクトを作成し、Ganache と構成を設定する方法を勉強し始めました。ローカルホストのトリュフ。
私はこの記事 (アップグレード可能なプロキシ契約) に従って練習しています。したがって、次のようなファイルが必要になります。
Registry.sol (主契約)
pragma solidity ^0.6.12;
import './Storage.sol';
contract Registry is Storage {
address public logic_contract;
function setLogicContract(address _c) public returns (bool success){
logic_contract = _c;
return true;
}
fallback () payable external {
address target = logic_contract;
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(gas(), target, ptr, calldatasize(), 0, 0)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 { revert(ptr, size) }
case 1 { return(ptr, size) }
}
}
Storage.sol (ストレージ目的)
pragma solidity ^0.6.12;
contract Storage {
uint public val;
}
LogicOne.sol (最初のロジック コントラクト)
pragma solidity ^0.6.12;
import './Storage.sol';
contract LogicOne is Storage {
function setVal(uint _val) public returns (bool success) {
val = 2 * _val;
return true;
}
}
LogicTwo.sol (2 番目のロジック コントラクト)
pragma solidity ^0.6.12;
import './Storage.sol';
contract LogicTwo is Storage {
function setVal(uint _val) public returns (bool success) {
val = 1000 * _val;
return true;
}
}
truffle コンソール経由でコントラクトを正常にデプロイできました。
ただし、Remix IDE に切り替えると、すべてのコントラクトをデプロイできますが、メインのコントラクトがlogic1 コントラクトにリンクされていないため、logic2 コントラクトに切り替えることができません。
Remix IDE で次のコードをシミュレートできませんでした。
Registry.at(Registry.address).setLogicContract(LogicOne.address)
Registry.at(Registry.address).setLogicContract(LogicTwo.address)
いつも私は「アドレス指定」をクリックします。ボタンをクリックすると、新しいメイン コントラクトがデプロイされます。期待される結果は、メイン契約は同じままですが、契約ロジックが LogicOne から LogicTwo に切り替わることです。
私が試したシナリオは以下の通りです:
シナリオ 1:
すべてのコントラクトを展開する
メイン コントラクトの setLogicContract() 関数を呼び出して、ロジック コントラクトのアドレスを設定します。
setVal() 関数を呼び出しましたが、「val」が呼び出されませんでした。主契約が更新されていない
シナリオ 2:
LogicOne コントラクトをデプロイする
「At Address」にLogicOne契約アドレスを入力します。そしてボタンをクリックしてメインコントラクトをデプロイします
setVal() 関数と「Val」関数が呼び出されます。主契約で更新される
「At Address」にLogicTwoの契約アドレスを入力しようとしました。ボタンをクリックして 2 番目のメイン コントラクトをデプロイします
ただし、これは新たに主契約を締結します。
契約を展開するステップの経験を共有できる人はいますか?ご意見があれば大歓迎です!
------------------------
「プロキシされた」サービスを呼び出すにはこの機能では、アドレスをプロキシ コントラクトに設定しますが、プロキシされる基礎となるコントラクトの ABI を使用します。
この場合、Registry.sol のアドレスと LogicOne.sol または LogicTwo.sol の ABI を使用します。 Remix でこれが可能かどうかはわかりません。
リンクした記事に基づいて、これを実行したいと考えています
LogicOne ABI を使用して、レジストリ コントラクトの「val」ストレージを変更します。
LogicOne.at(レジストリ.アドレス).setVal(2)
そして、自分の価値を取り戻すには、おそらく次のようにします。
LogicOne.at(レジストリ.アドレス).val()