はじめに
備忘録です。
詳しい説明などは以下記事か「アップグレード可能なsolidityコード」で検索。
Solidityのダイヤモンドスタンダードの提案にもっと詳しい説明もあります。
コード
Proxy.sol
pragma solidity ^0.7.0;
contract Proxy {
address public implementation;
function upgradeTo(address _address) public {
implementation = _address;
}
// fallback function
fallback () payable external {
address _impl = implementation;
require(_impl != address(0));
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 { revert(ptr, size) }
default { return(ptr, size) }
}
}
}
変わったところ
- fallback関数の表記方法が無名関数から
fallback()になった -
assembly内のYulコードの以下が関数となり()が必要になった。-
gas->gas() -
calldatasize->calldatasize() -
returndatasize->returndatasize()
-