자습서 - create2를 사용하여 배포하기 전에 계약 주소 예측
This tutorial is meant for those with a basic knowledge of Ethereum and smart contracts, who have some knowledge of Solidity.
The purpose of building this blog is to write down the detailed operation history and my memo for learning the dApps and solidity programming.
If you are also interested and want to get hands dirty, just follow these steps below and have fun!~
전제 조건
Remix 계약 테스트용
create2 opcode는 계약이 배포될 계약 주소를 예측할 수 있는 기능을 제공합니다. 이는 사용자 온보딩 및 확장성을 개선할 수 있는 많은 가능성을 열어줍니다.
계약 개요
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;
//Use Create2 to know contract address before it is deployed.
contract DeployWithCreate2 {
address public owner;
constructor(address _owner) {
owner = _owner;
}
}
contract Create2Factory {
event Deploy(address addr);
// to deploy another contract using owner address and salt specified
function deploy(uint _salt) external {
DeployWithCreate2 _contract = new DeployWithCreate2{
salt: bytes32(_salt) // the number of salt determines the address of the contract that will be deployed
}(msg.sender);
emit Deploy(address(_contract));
}
// get the computed address before the contract DeployWithCreate2 deployed using Bytecode of contract DeployWithCreate2 and salt specified by the sender
function getAddress(bytes memory bytecode, uint _salt) public view returns (address) {
bytes32 hash = keccak256(
abi.encodePacked(
bytes1(0xff), address(this), _salt, keccak256(bytecode)
)
);
return address (uint160(uint(hash)));
}
// get the ByteCode of the contract DeployWithCreate2
function getBytecode(address _owner) public pure returns (bytes memory) {
bytes memory bytecode = type(DeployWithCreate2).creationCode;
return abi.encodePacked(bytecode, abi.encode(_owner));
}
}
We use Create2Factory to deploy the contract DeployWithCreate2. First we get the byteCode of the contract DeployWithCreate2 using the function
getBytecode
, and then we usebyteCode
and owner-specifiedsalt
to compute the address of contract DeployWithCreate2. Finally we use functiondeploy
to deploy the contract DeployWithCreate2 to see the actuall contract address.
계약 테스트 단계
getBytecode
getAddress
동일한 솔트 값으로 배포
로그 확인
logs [
{
"from": "0xDA0bab807633f07f013f94DD0E6A4F96F8742B53",
"topic": "0x55ea6c6b31543d8e2ec6a72f71a79c0f4b72ed0d4757172b043d8f4f4cd84848",
"event": "Deploy",
"args": {
"0": "0x0B4f6a49C6a97B5dBB62F8A594cDefe5EabB4658",
"addr": "0x0B4f6a49C6a97B5dBB62F8A594cDefe5EabB4658"
}
}
Git 저장소
소스 코드(Create2.sol 또는 Example-44)를 위한 Git 저장소를 방문하신 것을 환영합니다. 아래에 메시지를 남기거나 제 프로필에 있는 이메일을 통해 저에게 연락 주시기 바랍니다.
고맙습니다!
hyc0812 / 견고성 필수 요소
솔리디티 프로그래밍 베이비 예제...
솔리디티-베이비 스텝스...
Solidity를 얻는 가장 좋은 방법은 예제에 접근하는 것입니다.
다음은 아기의 예입니다. 하나씩 입력하는 것이 좋습니다.
참조:
EnglishAuction 사용 및 테스트에 대한 설명입니다.
examples
예시-1
updateBalance 및 getBalance
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract MyLedger {
mapping(address => uint) public balances;
function updateBalance(uint newBal) public {
balances[msg.sender] = newBal;
}
function getBalance() public view returns(uint) {
return balances[msg.sender];
}
}
예시-2
Square에서 상속됨
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
import "@openzeppelin/contracts/utils/Strings.sol";
contract Shape {
uint height;
uint width;
constructor(uint _height, uint _width) {
height = _height;
width = _width;
}
}
contract Square is Shape {
constructor(uint h, uint w) Shape(h, w) {}
function getHeight()
…
View on GitHub
참조
https://docs.openzeppelin.com/cli/2.8/deploying-with-create2
https://blog.openzeppelin.com/getting-the-most-out-of-create2/
Reference
이 문제에 관하여(자습서 - create2를 사용하여 배포하기 전에 계약 주소 예측), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/yongchanghe/tutorial-using-create2-to-predict-the-contract-address-before-deploying-12cb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(자습서 - create2를 사용하여 배포하기 전에 계약 주소 예측), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yongchanghe/tutorial-using-create2-to-predict-the-contract-address-before-deploying-12cb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)