Open3

Adcanced EVM - opcodes, calling etc

MingleMingle(Thurendous)MingleMingle(Thurendous)

abi.encodePacked and abi.encode

string(abi.encodePacked(base64EncodedSvgPrefix, svgBase64Encoded));は文字列を連結させるためのもの。

0.8.12以上のバージョンの場合、string.concat(string name, string name2)を使って文字列を連結させる事ができるようになった。

EVM.codesは一つのopcodeを参照できるサイト、このサイトにあるすべてのopcodeがEVMの操作の基礎となっている。

    function encodeNumber() public pure returns(bytes memory) {
        return abi.encode(1);
    }

    function encodeNumberPacked() public pure returns(bytes memory) {
        return abi.encodePacked(uint16(1));
    }

これが返す値はこの通り、bytesとして返されている。

encodePackedを使った場合、結果はこちら。


    function encodeString() public pure returns (bytes memory) {
        return abi.encode("some string");
    }

    function encodeStringPacked() public pure returns (bytes memory) {
        return abi.encodePacked("some string");
    }

上記の2種類の関数の場合、それぞれの返り値はこのようになる。

encodeStringの場合、結構長い結果が返された。

encodeStringPackedの場合、結構短い。

    function multiEncode() public pure returns (bytes memory) {
        bytes memory someString = abi.encode("some string", "it's bigger now!");
        return someString;
    }

    function multiDecode() public pure returns (string memory, string memory) {
        (string memory decoded, string memory decoded2) = abi.decode(multiEncode(), (string, string));
        return (decoded, decoded2);
    }

この場合、それぞれの返り値はこうなる。

    function multiEncodePacked() public pure returns(bytes memory) {
        bytes memory someString = abi.encodePacked("some string", "It's bigger! ");
        return someString;
    }

    function multiStringCastPacked() public pure returns(string memory ) {
        string memory someString = string(multiEncodePacked());
        return someString;
    }

この場合、encodePackedを使っているので、こうなる。

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

contract Encoding {
    function combineStrings() public pure returns (string memory) {
        return string(abi.encodePacked("Hi mom!", "Miss you!"));
    }
}
➜ string(abi.encodePacked("Hi mom!", "Miss you!"));
➜ string memory ss =string(abi.encodePacked("Hi mom!", "Miss you!"));
➜ ss
Type: string
├ UTF-8: Hi mom!Miss you!
├ Hex (Memory):
├─ Length ([0x00:0x20]): 0x0000000000000000000000000000000000000000000000000000000000000010
├─ Contents ([0x20:..]): 0x4869206d6f6d214d69737320796f752100000000000000000000000000000000
├ Hex (Tuple Encoded):
├─ Pointer ([0x00:0x20]): 0x0000000000000000000000000000000000000000000000000000000000000020
├─ Length ([0x20:0x40]): 0x0000000000000000000000000000000000000000000000000000000000000010
└─ Contents ([0x40:..]): 0x4869206d6f6d214d69737320796f752100000000000000000000000000000000

ここlengthは0x0000000000000000000000000000000000000000000000000000000000000010で、16となっており、

MingleMingle(Thurendous)MingleMingle(Thurendous)

abi.encode with more learning

transationにはdataというfieldがあり、そこは自作できる。

自作するときに使うのはabi.encodeSignature()

ローレベルのコールを使うにはこの関数を使って、JSONのABI以外にhuman readableじゃないABIを使ってもいいです。

他のコントラクトを呼び出すときに以下のcallを使うことがある。

(bool success,) = recentWinner.call(value: address(this).balance}("");