Open3
Adcanced EVM - opcodes, calling etc
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となっており、
abi.encode with more learning
transationにはdataというfieldがあり、そこは自作できる。
自作するときに使うのはabi.encodeSignature()
ローレベルのコールを使うにはこの関数を使って、JSONのABI以外にhuman readableじゃないABIを使ってもいいです。
他のコントラクトを呼び出すときに以下のcallを使うことがある。
(bool success,) = recentWinner.call(value: address(this).balance}("");
関数signatureのデータベース