欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

creationCode和runtimeCode

程序员文章站 2022-03-25 11:33:40
...
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;

import "hardhat/console.sol";

interface IType {
    function it()external view;
}

contract Type {
    constructor(){
        console.log("name:",type(Type).name);
        console.log("creationCode:");
        //获得包含创建合同字节码的内存字节数组。它可以在内联汇编中构建自定义创建例程,
        //尤其是使用 create2 操作码。 不能在合同本身或派生的合同访问此属性。 因为会引起循环引用。
        bytes memory creationCode = type(console).creationCode;
        console.logBytes(creationCode);

        //获得合同的运行时字节码的内存字节数组。这是通常由 C 的构造函数部署的代码。 如果 C 有一个使用内联汇编的构造函数,
        //那么可能与实际部署的字节码不同。 还要注意库在部署时修改其运行时字节码以防范定期调用(guard against regular calls)。 
        //与 .creationCode 有相同的限制,不能在合同本身或派生的合同访问此属性。 因为会引起循环引用。
        console.log("runtimeCode:");
        console.logBytes(type(console).runtimeCode);

        //返回接口``I`` 的 bytes4 类型的接口 ID
        console.log("interfaceId:");
        console.logBytes4(type(IType).interfaceId);
        
        console.log("max:",type(uint256).max);
    }
}


const { expect } = require("chai");
const { ethers } = require("hardhat");


describe("contract", function () {
  it("test", async function () {
    const TestContract = await ethers.getContractFactory("Type");
    const testContract = await TestContract.deploy();
  });
});



contract
name Type
bytecode:
0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220cd1e8ce572c5f24bf61821c96174df3966ca45777a0f790101d5619d487d5aa664736f6c63430008040033
runtimeCode:
0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220cd1e8ce572c5f24bf61821c96174df3966ca45777a0f790101d5619d487d5aa664736f6c63430008040033
interfaceId:
0x5ce692f2
max 115792089237316195423570985008687907853269984665640564039457584007913129639935
    ✓ test (1049ms)