0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

delegatecallでさし替え

Last updated at Posted at 2018-04-16

「一度デプロイしたスマートコントラクトは修正することができない」
というのは理解はしていました
そのためデプロイする際には、不具合が無いようにするのだけど、やはり完全ではない
だとすればどうすれば?
いくつか調べてたところ、「delegatecallを使えば外部コントラクトを呼び出せる」とあったのでそれで差し替えることにしてみる

2つのコントラクトを用意、先にconslibのアドレスをmainにセットする形をとる

conslib.sol
pragma solidity ^0.4.0;

library conslib {

    function foo(uint _offset) constant returns(string _result)
    {
        return "hello world";
    }

}
main.sol
pragma solidity ^0.4.18;
//
contract main
{
    uint public result_;
    address public conslib = 0x00;
    string public message = "no message";
    function main(address _const) public{
        conslib = _const;
    }
    function foo() public returns(bool){
        return conslib.delegatecall(msg.data);
    }
    function setContract(address _const) public {
        conslib = _const;
    }
    function getContract() returns(address){
        return conslib;
    }
    function setMessage(string _message) returns(bool){
        message = _message;
        return true;
    }
    function getMessage() returns (string) {
        return message;
    }
}

こんな感じで差し替えができる感じとなる
あとは、conslibの新しいものを別途作りデプロイして、setContractでアドレスを設定すれば差し替えれれる・・・はずです。

この後の課題としては、差し込んだコントラクトの戻り値をどうやって取得するか、もしくはコントラクトから元のを操作させるかである

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?