Mua Crypto
Thị trường
Spot
FuturesBTC
Tiết kiệm
Trung tâm sự kiện
Trung tâm thưởng
Xem thêm
Lễ hội 0 phí
Triển khai xác định trước (CREATE2): Triển khai xác định trước (CREATE2) là gì?Triển khai xác định trước (CREATE2) là một phương thức của Ethereum Virtual Machine cho phép nhà phát triển tính toán địa chỉ hợp đồng thông minh trước khi trTriển khai xác định trước (CREATE2): Triển khai xác định trước (CREATE2) là gì?Triển khai xác định trước (CREATE2) là một phương thức của Ethereum Virtual Machine cho phép nhà phát triển tính toán địa chỉ hợp đồng thông minh trước khi tr

Triển khai xác định trước (CREATE2)

2026/10/13 15:27
#Advanced
Humanity
H$0.05951+5.92%
Gravity
G$0.003957+5.49%
PX
PX$0.0108-1.81%
MemeCore
M$0.7499-1.57%
Virtuals Protocol
VIRTUAL$0.6967+3.36%

Triển khai xác định trước (CREATE2) là gì?

Triển khai xác định trước (CREATE2) là một phương thức của Ethereum Virtual Machine cho phép nhà phát triển tính toán địa chỉ hợp đồng thông minh trước khi triển khai hợp đồng.

Phương thức này sử dụng opcode EVM

CREATE2
, có giá trị opcode là
0xf5
.

Hợp đồng được triển khai bằng CREATE2 sẽ nhận địa chỉ được tạo từ hợp đồng triển khai, salt do nhà phát triển chọn và hash của mã khởi tạo hợp đồng.

Điều này khác với cách triển khai hợp đồng thông thường, trong đó địa chỉ kết quả thường dựa trên địa chỉ của bên triển khai và nonce.

Vì CREATE2 không sử dụng nonce triển khai thay đổi theo thời gian của bên triển khai, nhà phát triển có thể dự đoán cùng một địa chỉ ngay cả khi factory đã tạo thêm các hợp đồng khác trong thời gian đó.

Đặc tính này hỗ trợ tài khoản thông minh counterfactual, các thành phần giao thức có địa chỉ dự đoán được, cơ sở hạ tầng ứng dụng cross-chain, state channel và hợp đồng có thể nhận tiền mã hóa trước khi được triển khai.

Đặc tả CREATE2 cuối cùng của EIP-1014 quy định opcode, công thức địa chỉ, cách tính gas, hành vi khi xảy ra xung đột và động lực ban đầu của việc triển khai counterfactual.

CREATE2 không khiến hợp đồng trở nên an toàn, vĩnh viễn, phi tập trung hoặc tự động giống hệt nhau trên mọi blockchain.

Phương thức này chỉ cung cấp cách xác định địa chỉ triển khai từ các đầu vào được chỉ định.

Vì sao CREATE2 được gọi là xác định?

Một quy trình được gọi là xác định khi cùng một đầu vào luôn tạo ra cùng một đầu ra.

Với CREATE2, đầu ra liên quan là địa chỉ hợp đồng thông minh.

Các đầu vào liên quan là địa chỉ bên triển khai CREATE2, salt 32 byte và hash của mã khởi tạo.

Bất kỳ ai biết các đầu vào này đều có thể tính địa chỉ dự kiến mà không cần gửi giao dịch blockchain.

Địa chỉ không phụ thuộc vào thời điểm triển khai, số khối hiện tại hay số hợp đồng factory đã tạo trước đó.

Thay đổi bất kỳ đầu vào nào trong công thức địa chỉ sẽ tạo ra một địa chỉ dự kiến khác.

Do đó, hợp đồng có thể được lên kế hoạch, tham chiếu, nạp tiền hoặc đưa vào thông điệp đã ký trước khi mã tồn tại on-chain.

Công thức địa chỉ CREATE2

Địa chỉ CREATE2 được tính theo công thức sau.

address = last20bytes(keccak256(0xff ++ deployer ++ salt ++ keccak256(init_code)))

Giá trị

0xff
là tiền tố một byte, được dùng để phân biệt địa chỉ CREATE2 với địa chỉ được tạo bằng công thức CREATE thông thường.

deployer
là địa chỉ 20 byte của hợp đồng trực tiếp thực thi opcode CREATE2.

salt
là giá trị 32 byte được cung cấp cho thao tác CREATE2.

init_code
là mã khởi tạo được thực thi trong quá trình tạo hợp đồng.

Mã khởi tạo được hash trước khi đưa vào dữ liệu đầu vào 85 byte của hash CREATE2 cuối cùng.

20 byte cuối của hash Keccak-256 cuối cùng trở thành địa chỉ hợp đồng.

Có thể tính công thức này trên máy cục bộ mà không tốn phí mạng, vì việc dự đoán kết quả không cần thay đổi trạng thái blockchain.

Bên triển khai CREATE2 là gì?

Bên triển khai CREATE2 là hợp đồng thông minh gọi trực tiếp opcode CREATE2.

Hợp đồng này thường được gọi là factory, hợp đồng triển khai, deterministic deployment proxy hoặc singleton factory.

Tài khoản do bên ngoài sở hữu gửi giao dịch đến factory không tự động là địa chỉ được dùng trong công thức CREATE2.

Thông thường, địa chỉ factory mới là địa chỉ bên triển khai cần dùng, vì factory thực thi opcode.

Sử dụng factory khác sẽ tạo ra địa chỉ hợp đồng dự kiến khác, ngay cả khi salt và mã khởi tạo giống nhau.

Đây là một trong những lý do nhà phát triển phải xác minh chính xác địa chỉ factory, thay vì tính kết quả từ ví gửi giao dịch.

Factory có thể cho phép mọi người triển khai mã khởi tạo tùy ý hoặc chỉ cho phép các tài khoản và mẫu hợp đồng được phê duyệt triển khai.

Quyền hạn và cách triển khai của factory có thể ảnh hưởng đến việc hợp đồng dự kiến có thể được triển khai thực tế hay không.

Salt CREATE2 là gì?

Salt CREATE2 là giá trị 32 byte tùy ý được đưa vào phép tính địa chỉ xác định trước.

Salt cho phép factory triển khai nhiều hợp đồng từ cùng một mã khởi tạo nhưng gán cho mỗi hợp đồng một địa chỉ khác nhau.

Salt có thể được tạo từ mã định danh người dùng, địa chỉ ví, số tài khoản, mã định danh token, phiên bản ứng dụng, giá trị ngẫu nhiên hoặc kết hợp nhiều trường.

Salt không cần được giữ bí mật.

Bất kỳ ai biết factory, salt và mã khởi tạo đều có thể tính cùng một địa chỉ.

Nhà phát triển nên xác định phương thức mã hóa salt rõ ràng, vì mã hóa không nhất quán có thể tạo ra địa chỉ ngoài dự kiến.

Ví dụ, số

1
, chuỗi văn bản có nội dung
1
và giá trị 32 byte kết thúc bằng
01
có thể được phần mềm diễn giải khác nhau.

Dự án có thể hash dữ liệu có cấu trúc để tạo salt cố định 32 byte, tránh mã hóa mơ hồ.

Mã khởi tạo là gì?

Mã khởi tạo, thường gọi tắt là init code, là mã EVM tạm thời được thực thi khi tạo hợp đồng thông minh.

Nhiệm vụ của mã này là thực hiện logic constructor và trả về bytecode thời gian chạy sẽ lưu lại tại địa chỉ mới.

Bản thân mã khởi tạo thường không được lưu làm mã vĩnh viễn của hợp đồng.

Công thức CREATE2 cam kết với hash của mã khởi tạo này.

Trong Solidity, toàn bộ mã khởi tạo thường gồm bytecode tạo hợp đồng và các tham số constructor được mã hóa theo ABI.

Tài liệu Solidity hiện tại về việc tạo hợp đồng có salt xác nhận rằng địa chỉ phụ thuộc vào bytecode tạo hợp đồng và các tham số constructor.

Thay đổi một tham số constructor sẽ làm thay đổi hash mã khởi tạo và do đó thay đổi địa chỉ dự kiến.

Khi tính địa chỉ CREATE2, nhà phát triển phải sử dụng chính xác đầu ra của compiler và cách mã hóa constructor dự định dùng để triển khai.

Mã khởi tạo và bytecode thời gian chạy

Mã khởi tạo và bytecode thời gian chạy có liên quan nhưng không giống nhau.

Mã khởi tạo chỉ chạy một lần trong quá trình triển khai.

Bytecode thời gian chạy là mã được lưu tại địa chỉ hợp đồng sau khi hoàn tất triển khai.

Công thức địa chỉ CREATE2 cam kết trực tiếp với hash mã khởi tạo, chứ không phải hash mã thời gian chạy cuối cùng.

Điểm khác biệt này tạo ra một lưu ý bảo mật quan trọng.

Constructor có thể đọc trạng thái blockchain bên ngoài và dùng thông tin đó để quyết định mã thời gian chạy hoặc giá trị lưu trữ ban đầu sẽ được tạo ra.

Vì vậy, cùng một mã khởi tạo có thể tạo ra hành vi khác nhau sau triển khai nếu được thực thi trong các điều kiện bên ngoài khác nhau.

Nhà phát triển muốn có cam kết chặt chẽ về hành vi nên tránh constructor phụ thuộc vào môi trường hoặc xác minh mã thời gian chạy và dữ liệu lưu trữ sau triển khai.

Tham số constructor và CREATE2

Trong quá trình triển khai bằng Solidity, các tham số constructor là một phần của mã khởi tạo.

Hợp đồng được tạo với địa chỉ chủ sở hữu là

0x111...
thường có địa chỉ CREATE2 khác với cùng hợp đồng được tạo với địa chỉ chủ sở hữu
0x222...
.

Quy tắc tương tự áp dụng cho tên token, giá trị nguồn cung, địa chỉ triển khai, danh sách validator, thiết lập phí và các đầu vào constructor khác.

Nhà phát triển phải mã hóa tham số constructor đúng thứ tự và định dạng mà ABI của hợp đồng yêu cầu.

Công cụ dự đoán địa chỉ bỏ qua tham số constructor sẽ tính sai kết quả.

Các hàm khởi tạo được gọi sau khi triển khai không ảnh hưởng đến công thức CREATE2, trừ khi lời gọi khởi tạo đó nằm trong constructor hoặc quy trình factory.

Tách riêng thao tác triển khai và khởi tạo có thể tạo rủi ro chiếm quyền nếu tài khoản khác có thể gọi hàm khởi tạo không được bảo vệ trước.

CREATE và CREATE2

CREATE và CREATE2 là các thao tác EVM dùng để tạo hợp đồng thông minh.

CREATE thông thường chủ yếu xác định địa chỉ mới từ tài khoản tạo hợp đồng và nonce triển khai của tài khoản đó.

Nonce tăng lên khi bên triển khai tạo thêm hợp đồng.

Vì vậy, nhà phát triển muốn dự đoán địa chỉ CREATE cần biết chính xác trình tự triển khai.

CREATE2 thay công thức địa chỉ dựa trên nonce bằng công thức dựa trên địa chỉ factory, salt và hash mã khởi tạo.

CREATE2 không làm thay đổi cách thực thi cơ bản của mã constructor hoặc cách lưu bytecode thời gian chạy được trả về.

Nó thay đổi cách xác định địa chỉ đích và thêm chi phí hash mã khởi tạo.

Cả hai thao tác đều thất bại nếu địa chỉ đích vi phạm quy tắc xung đột khi tạo hợp đồng của EVM.

CREATE2 được giới thiệu khi nào?

CREATE2 được quy định trong EIP-1014 vào năm 2018.

Opcode này được đưa vào bản nâng cấp mạng Constantinople của Ethereum.

Đặc tả nâng cấp Constantinople liệt kê EIP-1014 trong số các thay đổi giao thức được đưa vào bản nâng cấp.

Kể từ đó, CREATE2 trở thành một phần đã được thiết lập của EVM và được Solidity cũng như các công cụ phát triển phổ biến hỗ trợ.

Các mạng tương thích EVM có thể hỗ trợ CREATE2 sau khi kích hoạt hành vi giao thức tương ứng.

Nhà phát triển nên xác minh khả năng tương thích của mạng, thay vì cho rằng mọi blockchain dùng môi trường tương tự EVM đều triển khai các quy tắc giống hệt nhau.

CREATE2 trong Solidity

Solidity cung cấp cú pháp cấp cao để triển khai hợp đồng thông qua CREATE2.

Factory có thể dùng cú pháp

new ContractName{salt: saltValue}(constructorArguments)
.

Compiler Solidity chuẩn bị bytecode tạo hợp đồng, mã hóa các tham số constructor và tạo thao tác CREATE2.

Constructor payable cũng có thể nhận coin gốc của blockchain trong quá trình triển khai thông qua tùy chọn

value
.

Factory nên xác minh rằng thao tác triển khai trả về địa chỉ khác không như dự kiến.

Nhà phát triển cũng có thể gọi CREATE2 thông qua inline assembly khi cần kiểm soát trực tiếp bộ nhớ mã khởi tạo, độ dài, salt và khoản tiền cấp ban đầu.

Inline assembly làm tăng rủi ro triển khai và cần được kiểm thử cẩn thận.

Ví dụ Solidity đơn giản về CREATE2

contract Child {

address public owner;

constructor(address initialOwner) {

owner = initialOwner;

}

}

contract Factory {

function deploy(bytes32 salt, address initialOwner)

external

returns (address deployed)

{

Child child = new Child{salt: salt}(initialOwner);

deployed = address(child);

}

}

Trong ví dụ này, địa chỉ con dự kiến phụ thuộc vào địa chỉ factory, salt, bytecode tạo Child và tham số

initialOwner
đã mã hóa.

Thay đổi người gọi bên ngoài mà không đổi các đầu vào này không nhất thiết làm thay đổi địa chỉ.

Thay đổi

initialOwner
sẽ làm đổi địa chỉ vì tham số constructor là một phần của mã khởi tạo.

Dự đoán địa chỉ CREATE2

Nhà phát triển có thể tính địa chỉ CREATE2 trong hợp đồng thông minh, tập lệnh triển khai, ví hoặc ứng dụng cục bộ.

Phép tính phải sử dụng đúng địa chỉ factory sẽ thực thi CREATE2.

Phép tính cũng phải sử dụng salt ở dạng biểu diễn 32 byte cuối cùng.

Hash mã khởi tạo phải bao gồm chính xác bytecode tạo hợp đồng và các tham số constructor được mã hóa.

Cần so sánh kết quả với địa chỉ factory trả về sau khi triển khai.

Công cụ triển khai nên từ chối quy trình nếu địa chỉ dự kiến khác địa chỉ thực tế.

Địa chỉ dự đoán sai thường do dùng bytecode thời gian chạy thay vì bytecode tạo hợp đồng, bỏ sót tham số constructor, chọn sai factory hoặc mã hóa salt không đúng.

Triển khai counterfactual là gì?

Triển khai counterfactual là việc xem một địa chỉ hợp đồng thông minh trong tương lai có ý nghĩa trước khi mã được triển khai tại đó.

Các bên có thể tính địa chỉ và thống nhất trước về mã khởi tạo dự kiến của hợp đồng.

Họ có thể gửi tài sản đến địa chỉ đó, đưa địa chỉ vào hợp đồng khác hoặc tạo các ủy quyền đã ký liên quan đến địa chỉ.

Hợp đồng chỉ được triển khai khi cần thực thi.

Cách làm này có thể tránh một giao dịch triển khai ngay lập tức và giảm chi phí khởi tạo ban đầu.

EIP-1014 ban đầu nhấn mạnh tương tác counterfactual cho các hệ thống state channel, trong đó chỉ cần hợp đồng khi người tham gia xảy ra tranh chấp.

Triển khai counterfactual hiện cũng rất quan trọng với ví hợp đồng thông minh và trừu tượng hóa tài khoản.

Tài khoản hợp đồng thông minh counterfactual

Địa chỉ của tài khoản hợp đồng thông minh có thể được dự đoán bằng CREATE2 trước khi hợp đồng tài khoản được triển khai.

Người dùng có thể chia sẻ địa chỉ này và nhận tiền mã hóa hoặc token tại đó.

Sau đó, thao tác đầu tiên của tài khoản có thể triển khai ví và thực hiện một hành động trong cùng quy trình tổng thể.

Nhờ đó, người dùng không cần hoàn tất giao dịch tạo ví riêng trước khi nhận tài sản.

Đặc tả trừu tượng hóa tài khoản ERC-4337 hỗ trợ tạo tài khoản hợp đồng thông minh sender từ dữ liệu khởi tạo factory nếu tài khoản chưa tồn tại.

Factory tài khoản thường dùng CREATE2 để đảm bảo có thể tính địa chỉ sender trước khi triển khai.

Không phải mọi thiết kế trừu tượng hóa tài khoản đều bắt buộc sử dụng CREATE2, vì các mô hình tài khoản và ủy quyền mới hơn có thể dùng cơ chế khác.

Gửi tiền mã hóa đến địa chỉ chưa triển khai

Địa chỉ CREATE2 chưa được triển khai có thể nhận tiền mã hóa gốc của blockchain, vì một địa chỉ không cần có mã thời gian chạy để giữ số dư.

Token có thể thay thế và không thể thay thế cũng có thể được chuyển đến địa chỉ dự đoán nếu hợp đồng của chúng cho phép chuyển đến địa chỉ thông thường.

Tài sản vẫn gắn với địa chỉ đó dù tại đó chưa có mã hợp đồng.

Tài sản có thể được sử dụng sau khi hợp đồng dự kiến được triển khai thành công.

Đặc tính này có thể đơn giản hóa quy trình tạo ví và thiết kế ứng dụng counterfactual.

Tuy nhiên, nó cũng tạo ra rủi ro nghiêm trọng vì tài sản có thể không truy cập được nếu factory, salt hoặc mã khởi tạo dự kiến không chính xác.

Trước khi gửi giá trị đáng kể đến địa chỉ counterfactual, người dùng nên xác minh rằng hợp đồng thực sự có thể được triển khai.

Địa chỉ CREATE2 trống có thể giữ tiền không?

Có. Địa chỉ không có mã vẫn có thể có số dư tiền mã hóa gốc và token.

Chỉ riêng việc có số dư dương không ngăn cản việc triển khai CREATE2 tại địa chỉ đó.

Quy tắc xung đột của EVM tập trung vào việc địa chỉ đích có nonce khác không hoặc mã không rỗng hay không.

Thiết kế này cần thiết cho tài khoản counterfactual nhận tiền trước khi triển khai.

Sau khi triển khai, mã hợp đồng và quy tắc ủy quyền sẽ xác định cách sử dụng những tài sản đó.

Quy tắc xung đột CREATE2

Triển khai CREATE2 thất bại nếu địa chỉ đích đã có mã không rỗng hoặc nonce khác không.

Quy tắc này ngăn factory ghi đè hợp đồng hiện có tại cùng địa chỉ.

Quy tắc vẫn áp dụng ngay cả khi mã khởi tạo mới tính đúng ra địa chỉ đó.

Triển khai cũng thất bại nếu mã khởi tạo revert, hết gas, trả về mã không hợp lệ hoặc vi phạm quy tắc tạo hợp đồng khác.

Factory nên xử lý giá trị bằng không do opcode CREATE2 trả về và đưa ra lỗi hữu ích khi có thể.

Xung đột không có nghĩa hàm hash Keccak đã bị phá vỡ về mặt mật mã.

Thông thường, điều đó có nghĩa địa chỉ đích xác định trước đã được sử dụng theo quy tắc tài khoản của EVM.

Hai lần triển khai khác nhau có thể tạo cùng địa chỉ CREATE2 không?

Hai lần triển khai sẽ tính ra cùng địa chỉ nếu sử dụng cùng địa chỉ factory, salt và hash mã khởi tạo.

Về lý thuyết, mã khởi tạo khác nhau có thể có cùng hash, nhưng việc tìm ra va chạm Keccak-256 khả thi được xem là bất khả thi về mặt tính toán theo các giả định bảo mật hiện tại.

Vì chỉ 20 byte cuối của hash được dùng làm địa chỉ, va chạm địa chỉ ngẫu nhiên vẫn có thể xảy ra về mặt lý thuyết như với các địa chỉ Ethereum khác.

Với năng lực tính toán hiện tại, việc tạo va chạm theo mục tiêu vẫn không khả thi trên thực tế.

Dù vậy, nhà phát triển không nên xem một địa chỉ có hình thức tương tự là bằng chứng các đầu vào triển khai là chính xác.

Dùng lại salt

Factory có thể dùng lại salt nếu mã khởi tạo khác nhau, vì hash mã khởi tạo sẽ tạo ra địa chỉ khác.

Cùng một factory không thể triển khai thành công hai lần cùng mã khởi tạo và cùng salt khi địa chỉ đích ban đầu vẫn đang được sử dụng.

Dự án có thể cấm dùng lại salt ở cấp ứng dụng để dễ theo dõi mục đích triển khai hơn.

Factory công khai có thể cho phép bất kỳ ai gửi salt đã dùng trước đó vì công thức đầy đủ còn bao gồm hash mã khởi tạo.

Bản thân tính duy nhất của salt không phải thuộc tính bảo mật hoàn chỉnh.

Cần xem xét toàn bộ tổ hợp factory, salt và mã khởi tạo.

Front-run một lần triển khai CREATE2

Giao dịch CREATE2 đang chờ có thể hiển thị trước khi được đưa vào một block.

Người dùng khác có thể sao chép lời gọi factory và thử triển khai hợp đồng trước.

Nếu factory không cần cấp phép sử dụng cùng salt và mã khởi tạo giống hệt, lần triển khai sao chép sẽ tạo cùng cam kết mã tại cùng địa chỉ dự kiến.

Khi đó, giao dịch ban đầu có thể thất bại vì địa chỉ đích đã được sử dụng.

Điều này vẫn có thể gây vấn đề về thời điểm, lãng phí gas hoặc làm gián đoạn quy trình ứng dụng.

Rủi ro nghiêm trọng hơn nếu hành vi constructor đọc dữ liệu môi trường thay đổi, chẳng hạn dữ liệu block, nguồn gốc giao dịch, trạng thái hợp đồng bên ngoài hoặc tham số factory phụ thuộc vào người gọi.

Đề xuất factory xác định hiện tại khuyến nghị sử dụng factory phổ biến cho hợp đồng hoàn toàn xác định, thay vì các đợt triển khai có kết quả phụ thuộc vào môi trường thực thi.

Rủi ro front-run constructor

Địa chỉ CREATE2 cam kết với mã khởi tạo nhưng không cố định toàn bộ trạng thái bên ngoài mà constructor có thể đọc.

Kẻ tấn công kiểm soát thời điểm triển khai có thể khiến constructor đọc giá, giá trị block, mục nhập registry hoặc trạng thái hợp đồng bên ngoài khác với dự kiến.

Mã thời gian chạy hoặc dữ liệu lưu trữ ban đầu được tạo ra có thể khác điều người dùng ban đầu mong đợi.

Khi có thể, constructor nên nhận cấu hình quan trọng qua tham số constructor đã được cam kết thay vì đọc trạng thái bên ngoài có thể thay đổi.

Tập lệnh triển khai nên xác minh bytecode thời gian chạy, quyền sở hữu, dữ liệu lưu trữ và các sự kiện được phát ra sau khi tạo hợp đồng.

Rủi ro từ hàm khởi tạo không được bảo vệ

Hợp đồng proxy và minimal clone thường dùng các hàm khởi tạo thay cho constructor.

Hàm khởi tạo thiết lập quyền sở hữu, quyền hạn, thông tin triển khai hoặc trạng thái thiết yếu khác sau khi triển khai.

Có thể dự đoán địa chỉ CREATE2 nhưng điều đó không tự động bảo vệ hàm khởi tạo.

Nếu thao tác triển khai và khởi tạo diễn ra trong các giao dịch riêng, kẻ tấn công có thể gọi hàm khởi tạo trước.

Factory nên khởi tạo hợp đồng nguyên tử trong giao dịch triển khai hoặc áp dụng cơ chế xác thực nghiêm ngặt.

Địa chỉ xác định trước không thể bù đắp cho thiết kế khởi tạo thiếu bảo vệ.

Factory CREATE2

Factory CREATE2 là hợp đồng thông minh có thể tái sử dụng, nhận salt và mã khởi tạo rồi thực thi opcode CREATE2.

Factory cho phép tài khoản do bên ngoài sở hữu và các hợp đồng thông minh khác sử dụng triển khai xác định trước thông qua một giao diện nhất quán.

Factory tối giản có thể nhận mã tùy ý mà không yêu cầu cấp quyền.

Factory chuyên dụng có thể chỉ triển khai các bản triển khai tài khoản hoặc mô-đun ứng dụng được phê duyệt.

Nhà phát triển nên kiểm tra bytecode thời gian chạy, lịch sử triển khai, quyền hạn, cách xử lý lỗi và hành vi chuyển giá trị của factory.

Factory độc hại có thể thay đổi đầu vào, hạn chế triển khai, giữ tiền hoặc thực thi mã ngoài dự kiến.

Singleton factory

Singleton factory là factory xác định trước, được thiết kế để tồn tại tại cùng một địa chỉ trên nhiều mạng EVM.

Địa chỉ factory dùng chung giúp nhà phát triển tạo địa chỉ hợp đồng con giống nhau trên từng mạng được hỗ trợ.

ERC-2470 đề xuất một singleton factory CREATE2 không cần cấp phép để triển khai xác định trước.

Đề xuất này sử dụng phương thức triển khai không cần khóa để factory có thể được tạo tại địa chỉ đã biết trên các mạng tương thích.

Tính đến tháng 7 năm 2026, ERC-2470 được đánh dấu là Stagnant trong kho EIP, dù khái niệm factory xác định rộng hơn vẫn có ý nghĩa phổ biến.

Trạng thái của đề xuất trong kho lưu trữ và tình trạng triển khai thực tế của hợp đồng là hai vấn đề riêng biệt.

Triển khai xác định trước đa chuỗi

CREATE2 có thể hỗ trợ triển khai hợp đồng tại cùng một địa chỉ trên một số mạng EVM.

Để có cùng kết quả, địa chỉ factory CREATE2, salt và hash mã khởi tạo phải giống nhau trên từng mạng.

Chỉ sử dụng cùng một ví triển khai ứng dụng là chưa đủ nếu ví đó gọi các địa chỉ factory khác nhau.

Metadata của compiler, liên kết thư viện, tham số constructor và thay đổi mã nguồn hợp đồng có thể làm thay đổi hash mã khởi tạo.

Chain ID không được đưa trực tiếp vào công thức CREATE2 cơ bản.

Tuy nhiên, constructor hoặc công cụ triển khai có thể đưa dữ liệu riêng theo chain vào, làm thay đổi mã khởi tạo hoặc trạng thái được triển khai.

Nhà phát triển nên xác minh riêng mã đã triển khai trên từng mạng, ngay cả khi địa chỉ giống nhau.

Lợi ích của việc triển khai cùng địa chỉ trên nhiều chuỗi

Địa chỉ hợp đồng giống nhau giúp giảm số lượng địa chỉ mà ví, giao diện, thư viện phần mềm và hợp đồng khác cần lưu trữ.

Nhà phát triển có thể dùng một hằng số địa chỉ trên nhiều mạng được hỗ trợ.

Người dùng ít có khả năng sao chép địa chỉ hợp đồng từ nhầm mạng hơn.

Tài khoản hợp đồng thông minh cũng có thể cung cấp một địa chỉ nhất quán trên nhiều chain.

Điều này cải thiện tính dễ sử dụng nhưng có thể tạo cảm giác an toàn giả nếu một mạng có mã hoặc cấu hình khác tại cùng địa chỉ.

Luôn cần đánh giá địa chỉ cùng với mã định danh chain và bytecode đã xác minh.

Các đề xuất factory xác định hiện tại

Cơ sở hạ tầng factory xác định tiếp tục phát triển khi có thêm mạng EVM và rollup.

Tính đến tháng 7 năm 2026, EIP-7997 đang ở trạng thái Review và đề xuất chính thức yêu cầu một factory xác định được sử dụng rộng rãi tại địa chỉ cụ thể trên các chain EVM.

Đề xuất này chưa phải bản cuối và không nên được xem là bảo đảm phổ quát cho mọi mạng.

ERC-7955 vẫn là đề xuất Draft về cách khởi tạo factory CREATE2 phổ quát không cần cấp phép thông qua các khả năng của EIP-7702.

Các đề xuất này giải quyết thực tế rằng chỉ CREATE2 không thể bảo đảm factory ban đầu được đặt tại cùng một địa chỉ trên mọi mạng.

Nhà phát triển nên kiểm tra trạng thái đề xuất hiện tại và trạng thái mạng thực tế trước khi dựa vào factory phổ quát.

CREATE2 và trừu tượng hóa tài khoản

Trừu tượng hóa tài khoản cho phép tài khoản hợp đồng thông minh sử dụng các quy tắc xác thực và thực thi có thể lập trình.

Ví có thể hỗ trợ nhiều người ký, Passkey, người giám hộ khôi phục, giới hạn chi tiêu, thao tác theo lô và tài trợ phí.

CREATE2 cho phép factory ví tính địa chỉ tài khoản trước khi triển khai hợp đồng ví.

Người dùng có thể nhận tiền tại địa chỉ này và triển khai tài khoản khi xử lý thao tác đầu tiên.

ERC-4337 có thể đưa dữ liệu factory vào để tạo tài khoản nếu sender chưa tồn tại.

Địa chỉ counterfactual của tài khoản phải khớp với địa chỉ do lời gọi factory tạo ra.

Nếu factory triển khai mã ở địa chỉ khác, thao tác tài khoản sẽ thất bại theo quy trình xác thực tiêu chuẩn.

CREATE2 và chữ ký trước khi triển khai

Tài khoản hợp đồng counterfactual có thể cần ký thông điệp xác thực trước khi được triển khai.

Quy trình xác minh chữ ký hợp đồng thông thường không thể gọi tài khoản vì tại địa chỉ đó chưa tồn tại mã thời gian chạy.

ERC-6492 xác định định dạng bọc để xác minh chữ ký được tạo thay mặt cho tài khoản hợp đồng chưa triển khai.

Quy trình xác minh có thể mô phỏng hoặc thực hiện thao tác triển khai factory cần thiết trước khi kiểm tra logic chữ ký của hợp đồng.

Tiêu chuẩn này khuyến nghị dùng hợp đồng CREATE2 vì địa chỉ của chúng có thể dự đoán được.

Chữ ký từ tài khoản counterfactual nên được xác minh theo tiêu chuẩn chữ ký hợp đồng phù hợp, thay vì được xem là chữ ký thông thường của tài khoản do bên ngoài sở hữu.

CREATE2 và tài khoản gắn với token

Tài khoản gắn với token là tài khoản hợp đồng thông minh liên kết với token không thể thay thế.

Tài khoản có thể giữ tiền mã hóa, token, NFT và các tài sản on-chain khác.

ERC-6551 sử dụng CREATE2 để địa chỉ tài khoản gắn với token có thể tồn tại theo dạng counterfactual trước khi triển khai.

Nhờ đó, tài sản có thể được chuyển đến tài khoản của token trước khi có người trả phí triển khai hợp đồng tài khoản.

Theo quy tắc của tiêu chuẩn, địa chỉ tài khoản phụ thuộc vào registry, bản triển khai, salt, mã định danh blockchain, hợp đồng token và mã định danh token.

Thông thường, quyền sở hữu NFT kiểm soát sẽ quyết định ai có thể thực hiện hành động thông qua tài khoản gắn với token.

CREATE2 và state channel

State channel cho phép các bên tham gia thực hiện nhiều tương tác off-chain, đồng thời dùng hợp đồng blockchain để thực thi kết quả cuối cùng hoặc giải quyết tranh chấp.

Các bên có thể thống nhất trước về mã và địa chỉ của hợp đồng giải quyết tranh chấp.

CREATE2 cho phép họ tính địa chỉ đó mà chưa cần triển khai hợp đồng ngay.

Trong suốt quá trình off-chain, các bên có thể tham chiếu hợp đồng counterfactual.

Chỉ cần triển khai hợp đồng khi cần thực thi.

Đây là một trong những trường hợp sử dụng ban đầu được mô tả trong EIP-1014.

CREATE2 và hợp đồng proxy tối giản

Proxy tối giản là hợp đồng nhỏ chuyển tiếp các lệnh gọi đến hợp đồng triển khai.

Factory có thể kết hợp proxy tối giản với CREATE2 để tạo địa chỉ tài khoản hoặc ứng dụng có thể dự đoán.

Địa chỉ hợp đồng triển khai có thể là một phần của mã khởi tạo proxy.

Do đó, thay đổi địa chỉ hợp đồng triển khai có thể làm thay đổi địa chỉ proxy dự kiến.

Một số factory thiết lập tham số khởi tạo trong dữ liệu lưu trữ của proxy được triển khai ngay trong cùng giao dịch.

Nhà phát triển cần xác minh cam kết xác định bao gồm bản triển khai, dữ liệu khởi tạo hay chỉ một khung proxy chung.

CREATE2 và hợp đồng có thể nâng cấp

Bản thân CREATE2 không phải là hệ thống nâng cấp.

Hợp đồng được triển khai bằng CREATE2 có thể nâng cấp nếu sử dụng proxy hoặc kiến trúc nâng cấp được xác định rõ khác.

Trong thiết kế đó, proxy giữ nguyên địa chỉ xác định trước, còn tham chiếu đến bản triển khai có thể thay đổi.

Quản trị viên proxy, quy tắc quản trị, thời gian trì hoãn và quy trình xác minh bản triển khai quyết định mức độ an toàn của việc nâng cấp.

Địa chỉ proxy xác định trước không đảm bảo hành vi bất biến.

Người dùng nên kiểm tra quyền nâng cấp, thay vì cho rằng địa chỉ có thể dự đoán đồng nghĩa với mã vĩnh viễn.

CREATE2, SELFDESTRUCT và triển khai lại

Một số thiết kế CREATE2 trước đây sử dụng

SELFDESTRUCT
để xóa hợp đồng rồi triển khai hành vi khác tại cùng địa chỉ.

Các thiết kế này thường được gọi là hợp đồng metamorphic.

Quy tắc SELFDESTRUCT hiện tại trong EIP-6780 nhìn chung ngăn hợp đồng đã tồn tại lâu dài xóa mã và dữ liệu lưu trữ.

Khi SELFDESTRUCT được gọi bởi hợp đồng không được tạo trong cùng giao dịch, thao tác này chuyển số dư nhưng không xóa mã, dữ liệu lưu trữ hoặc tài khoản.

Do đó, các phương thức nâng cấp thông thường dựa trên việc hủy một hợp đồng đã triển khai rồi tạo lại hợp đồng tại cùng địa chỉ CREATE2 không còn hoạt động.

EIP-6780 nêu rõ nên dùng thiết kế nâng cấp dựa trên proxy đã được thiết lập thay vì triển khai lại bằng CREATE2 để nâng cấp.

SELFDESTRUCT vẫn đang bị loại bỏ dần và các hệ thống mới không nên dựa vào giả định rằng hành vi này sẽ luôn giữ nguyên.

Rủi ro của hợp đồng metamorphic

Hợp đồng metamorphic được thiết kế để thay đổi mã hoạt động tại một địa chỉ ổn định bằng cách hủy hợp đồng rồi triển khai lại.

Trước khi có các hạn chế SELFDESTRUCT hiện tại, mô hình này có thể khiến việc tin tưởng dựa trên địa chỉ trở nên đặc biệt nguy hiểm.

Người dùng có thể xác minh một phiên bản mã rồi tương tác với mã khác tại cùng địa chỉ sau đó.

Quy tắc Ethereum hiện tại đã phá vỡ mô hình triển khai lại dài hạn nói chung, nhưng các mạng cũ hoặc môi trường EVM khác có thể áp dụng hành vi SELFDESTRUCT khác.

Công cụ bảo mật cần đánh giá quy tắc của blockchain cụ thể và giai đoạn block đang được phân tích.

Giao dịch lịch sử cần được diễn giải theo quy tắc giao thức có hiệu lực tại thời điểm giao dịch diễn ra.

Chi phí gas của CREATE2

CREATE2 có cơ cấu gas tương tự CREATE thông thường và cộng thêm chi phí hash mã khởi tạo.

EIP-1014 quy định chi phí hash bổ sung này dựa trên số từ 32 byte trong mã khởi tạo.

Mã khởi tạo càng lớn thì càng cần nhiều gas để tính địa chỉ, cũng như cho bộ nhớ và việc thực thi constructor.

Quá trình triển khai cũng tốn phí lưu bytecode thời gian chạy và thực hiện các thao tác constructor.

Lịch gas của mạng có thể thay đổi qua các bản nâng cấp giao thức, vì vậy không nên xem ước tính gas cố định là vĩnh viễn.

Tài khoản counterfactual đã được nạp tiền vẫn có thể cần đủ tiền mã hóa gốc hoặc bên tài trợ phí để thanh toán chi phí triển khai sau này.

Giới hạn kích thước mã khởi tạo

Ethereum áp dụng giới hạn và cơ chế tính phí theo giao thức đối với mã khởi tạo hợp đồng.

EIP-3860 đưa vào cơ chế tính phí bổ sung cho init code và quy định kích thước mã khởi tạo tối đa.

Quy tắc này áp dụng cho cả triển khai CREATE và CREATE2.

Factory lớn không nên cho rằng có thể gửi thành công logic constructor với kích thước tùy ý.

Công cụ phát triển nên kiểm tra mã khởi tạo đã biên dịch cuối cùng với các giới hạn hiện hành của mạng.

Địa chỉ hợp đồng tùy biến

Nhà phát triển có thể tìm qua nhiều giá trị salt cho đến khi địa chỉ CREATE2 dự kiến có tiền tố hoặc mẫu mong muốn.

Quá trình này được gọi là đào địa chỉ hợp đồng tùy biến.

Một tiền tố ngắn dễ nhận biết có thể giúp nhận diện địa chỉ bằng mắt dễ hơn.

Điều này không cải thiện bảo mật hoặc quyền hạn của hợp đồng thông minh.

Người dùng nên xác minh toàn bộ địa chỉ vì kẻ lừa đảo có thể tạo địa chỉ có tiền tố và hậu tố tương tự.

Địa chỉ tùy biến không bao giờ nên thay thế việc xác minh bytecode và hồ sơ triển khai đáng tin cậy.

CREATE2 và tấn công đầu độc địa chỉ

Tấn công đầu độc địa chỉ nhằm khiến một địa chỉ lừa đảo xuất hiện trong lịch sử giao dịch hoặc giao diện ví của người dùng.

Kẻ tấn công có thể tạo địa chỉ có các ký tự trông giống địa chỉ đáng tin cậy.

CREATE2 có thể hỗ trợ tìm kiếm địa chỉ hợp đồng có mẫu hình thức mong muốn bằng cách thay đổi salt.

Cuộc tấn công không đòi hỏi phải phá CREATE2 hay Keccak-256.

Nó lợi dụng việc người dùng chỉ kiểm tra phần đầu hoặc phần cuối của địa chỉ.

Trước khi gửi tiền mã hóa, người dùng nên xác minh toàn bộ địa chỉ hoặc sử dụng hệ thống sổ địa chỉ đáng tin cậy.

Nhầm lẫn địa chỉ cross-chain

Cùng một địa chỉ hệ thập lục phân có thể tồn tại trên nhiều mạng EVM.

Tùy mạng, địa chỉ có thể chứa cùng mã, mã khác nhau hoặc không có mã.

Kế hoạch triển khai xác định trước có thể tạo địa chỉ giống nhau, nhưng mã định danh blockchain vẫn rất quan trọng.

Gửi tài sản đến đúng địa chỉ nhưng sai mạng có thể khiến tài sản không truy cập được thông qua ứng dụng dự kiến.

Ví và giao diện nên hiển thị rõ cả địa chỉ hợp đồng lẫn mạng đã chọn.

Nhà phát triển nên xác minh hash mã và cấu hình trên mọi chain được hỗ trợ.

Rủi ro khi tin tưởng factory

Việc tính địa chỉ xác định trước giả định rằng factory được chọn sẽ hoạt động như dự kiến.

Factory có thể thay đổi salt, sửa mã khởi tạo, áp dụng kiểm soát truy cập, thu phí hoặc chuyển giá trị triển khai ngoài dự kiến.

Factory có thể nâng cấp và thay đổi sau khi nhà phát triển xem xét ban đầu.

Factory do một khóa riêng kiểm soát có thể không còn khả dụng hoặc trở nên độc hại nếu khóa bị mất hay xâm phạm.

Factory không cần cấp phép giảm một số rủi ro kiểm soát nhưng có thể gây lo ngại về front-running và spam.

Nhà phát triển nên xác minh mã thời gian chạy của factory và cơ chế triển khai trước khi dựa vào địa chỉ dự đoán.

Rủi ro từ compiler và metadata

Các phiên bản compiler Solidity có thể tạo bytecode tạo hợp đồng khác nhau từ cùng mã nguồn.

Thiết lập compiler như số vòng tối ưu hóa, cấu hình metadata, thư viện được liên kết và phiên bản EVM mục tiêu cũng có thể làm thay đổi bytecode.

Một khác biệt nhỏ trong bytecode sẽ tạo ra hash mã khởi tạo và địa chỉ CREATE2 khác.

Nhà phát triển nên cố định phiên bản compiler và cấu hình bản dựng dùng cho triển khai xác định trước.

Quy trình dựng có thể tái lập giúp người dùng độc lập xác nhận rằng mã nguồn đã công bố tạo ra bytecode được triển khai.

Chỉ sao chép mã nguồn Solidity mà không có thiết lập dựng có thể chưa đủ để tái tạo địa chỉ dự kiến.

Liên kết thư viện

Hợp đồng Solidity có thể chứa các vị trí giữ chỗ cần được thay bằng địa chỉ thư viện đã triển khai trước khi tạo hợp đồng.

Bytecode tạo hợp đồng sau khi liên kết trở thành một phần của mã khởi tạo CREATE2.

Thay đổi địa chỉ thư viện sẽ làm thay đổi địa chỉ hợp đồng dự kiến.

Do đó, triển khai đa chuỗi có thể không tạo ra địa chỉ giống nhau nếu thư viện được liên kết nằm tại các địa chỉ khác nhau.

Dự án muốn có cùng địa chỉ trên nhiều chain có thể cần triển khai thư viện theo cách xác định trước trước khi triển khai các hợp đồng phụ thuộc.

Danh sách kiểm tra xác minh CREATE2

Xác minh blockchain và địa chỉ factory trước khi tính địa chỉ đích dự kiến.

Xác nhận cách mã hóa chính xác salt 32 byte.

Dùng bytecode tạo hợp đồng, không dùng bytecode thời gian chạy.

Đưa tham số constructor được mã hóa theo ABI vào mã khởi tạo.

Cố định phiên bản compiler, thiết lập tối ưu hóa, thư viện được liên kết và cấu hình metadata.

Kiểm tra xem địa chỉ dự kiến đã có mã hoặc nonce khác không hay chưa.

Mô phỏng lời gọi factory và xem xét mọi phụ thuộc của constructor vào trạng thái bên ngoài.

Sau khi triển khai, so sánh địa chỉ thực tế, bytecode thời gian chạy, cấu hình lưu trữ, chủ sở hữu, bản triển khai và sự kiện được phát ra với kết quả dự kiến.

Ưu điểm của CREATE2

CREATE2 cho phép biết địa chỉ hợp đồng trước khi triển khai.

CREATE2 hỗ trợ ví counterfactual và hợp đồng có thể nhận tài sản trước khi mã được tạo.

CREATE2 loại bỏ sự phụ thuộc vào nonce triển khai thay đổi của factory.

CREATE2 có thể tạo địa chỉ ứng dụng nhất quán trên các mạng EVM tương thích nếu mọi đầu vào cần thiết khớp nhau.

CREATE2 hỗ trợ thiết kế state channel và hợp đồng tranh chấp hiệu quả.

CREATE2 có thể đơn giản hóa việc quản lý địa chỉ trong ví, thư viện phần mềm, hợp đồng thông minh và giao diện đa chuỗi.

CREATE2 cũng cho phép xây dựng hệ thống triển khai có thể tái lập, trong đó người dùng tự xác minh địa chỉ đích dự kiến.

Hạn chế của CREATE2

CREATE2 không đảm bảo hợp đồng sẽ thực sự được triển khai.

CREATE2 không đảm bảo factory đáng tin cậy hoặc khả dụng trên mọi mạng.

CREATE2 không đảm bảo địa chỉ giống nhau chứa mã thời gian chạy hoặc trạng thái giống nhau trên các chain.

CREATE2 không bảo vệ proxy chưa được khởi tạo, constructor không an toàn, quản trị viên bị xâm phạm hoặc hợp đồng thông minh có lỗ hổng.

CREATE2 không cho phép ghi đè hợp đồng hiện có khi địa chỉ đích đã có mã hoặc nonce khác không.

Quy tắc SELFDESTRUCT hiện tại ngăn các phương thức nâng cấp phổ biến dựa trên việc hủy hợp đồng tồn tại lâu dài rồi triển khai lại.

CREATE2 cũng tạo ra rủi ro vận hành nếu người dùng gửi tiền đến địa chỉ dự đoán trước khi xác minh đầy đủ các đầu vào triển khai.

Câu hỏi thường gặp

CREATE2 là gì, giải thích đơn giản?

CREATE2 là lệnh EVM cho phép nhà phát triển tính địa chỉ hợp đồng thông minh trước khi triển khai hợp đồng.

Triển khai xác định trước có nghĩa là gì?

Triển khai xác định trước nghĩa là cùng các đầu vào triển khai đã xác định sẽ tạo ra cùng một địa chỉ hợp đồng được tính toán.

EIP nào giới thiệu CREATE2?

CREATE2 được giới thiệu thông qua EIP-1014.

Opcode CREATE2 là gì?

Opcode CREATE2 là

0xf5
.

Những đầu vào nào xác định địa chỉ CREATE2?

Địa chỉ phụ thuộc vào địa chỉ factory CREATE2, salt 32 byte và hash của mã khởi tạo.

CREATE2 có dùng nonce không?

CREATE2 không dùng nonce tạo hợp đồng thay đổi của factory trong công thức địa chỉ.

Người gửi giao dịch có nằm trong công thức CREATE2 không?

Công thức bao gồm hợp đồng trực tiếp thực thi CREATE2, thường là factory chứ không phải ví bên ngoài gọi factory.

Salt CREATE2 là gì?

Salt là giá trị 32 byte dùng để phân biệt các lần triển khai xác định trước và tạo ra địa chỉ khác nhau.

Salt CREATE2 có cần được giữ bí mật không?

Không. Thông thường không cần giữ bí mật salt.

Init code là gì?

Init code là mã tạo hợp đồng tạm thời, chạy constructor và trả về bytecode thời gian chạy được lưu tại địa chỉ mới.

CREATE2 có hash bytecode thời gian chạy không?

Công thức địa chỉ hash mã khởi tạo, chứ không trực tiếp chỉ hash bytecode thời gian chạy cuối cùng.

Tham số constructor có làm thay đổi địa chỉ CREATE2 không?

Có. Tham số constructor Solidity được đưa vào mã khởi tạo và thường làm thay đổi địa chỉ dự kiến.

Có thể dự đoán địa chỉ CREATE2 off-chain không?

Có. Có thể tính địa chỉ trên máy cục bộ mà không cần gửi giao dịch blockchain.

Địa chỉ CREATE2 chưa triển khai có thể nhận tiền mã hóa không?

Có. Địa chỉ dự đoán có thể nhận tiền mã hóa gốc và token tương thích trước khi hợp đồng được triển khai.

Gửi tiền đến địa chỉ chưa triển khai có an toàn không?

Việc này có rủi ro nếu chưa xác minh factory, salt, mã khởi tạo, khả năng triển khai và quy tắc ủy quyền trong tương lai.

CREATE2 có thể triển khai đè lên hợp đồng hiện có không?

Không. Triển khai thất bại nếu địa chỉ đích đã có mã không rỗng hoặc nonce khác không.

CREATE2 có thể triển khai cùng một hợp đồng hai lần không?

Cùng factory, salt và mã khởi tạo không thể triển khai thành công hai lần khi địa chỉ đích ban đầu vẫn đang được sử dụng.

Có thể dùng lại cùng salt không?

Có. Cùng một salt có thể tạo địa chỉ khác nếu factory hoặc hash mã khởi tạo khác.

Có thể front-run một lần triển khai CREATE2 không?

Người khác có thể sao chép lời gọi factory công khai và triển khai trước. Điều này có thể gây gián đoạn về thời điểm và nguy hiểm nếu hành vi constructor phụ thuộc vào dữ liệu bên ngoài thay đổi.

CREATE2 có đảm bảo mã giống nhau trên các chain không?

Không. Địa chỉ giống nhau đòi hỏi các đầu vào khớp nhau, nhưng môi trường constructor, quá trình khởi tạo, cấu hình và trạng thái mạng vẫn có thể tạo ra khác biệt đáng kể.

Làm cách nào CREATE2 tạo cùng địa chỉ trên nhiều mạng?

Phải dùng cùng địa chỉ factory, salt và hash mã khởi tạo trên mọi mạng tương thích.

Chain ID có nằm trong công thức CREATE2 không?

Công thức cơ bản không trực tiếp bao gồm chain ID, dù mã triển khai hoặc tham số constructor có thể chứa thông tin riêng theo chain.

Factory CREATE2 là gì?

Factory CREATE2 là hợp đồng thông minh thực hiện triển khai xác định trước cho người dùng hoặc các hợp đồng khác.

Singleton factory là gì?

Singleton factory là bên triển khai CREATE2 được dự kiến tồn tại tại cùng một địa chỉ đã biết trên nhiều mạng.

Triển khai counterfactual là gì?

Triển khai counterfactual là việc sử dụng hoặc tham chiếu một địa chỉ hợp đồng có thể dự đoán trước khi hợp đồng được triển khai.

CREATE2 hỗ trợ ví hợp đồng thông minh như thế nào?

CREATE2 cho phép tính địa chỉ ví và nạp tiền vào đó trước khi tạo hợp đồng ví.

CREATE2 liên quan thế nào đến ERC-4337?

Factory tài khoản ERC-4337 thường sử dụng CREATE2 để xác định và triển khai địa chỉ tài khoản hợp đồng thông minh có thể dự đoán.

Hợp đồng chưa triển khai có thể ký thông điệp không?

ERC-6492 cung cấp phương thức xác minh chữ ký liên quan đến một số tài khoản hợp đồng counterfactual trước khi triển khai.

CREATE2 có phải cơ chế nâng cấp không?

Không. Khả năng nâng cấp cần một thiết kế proxy hoặc quản trị riêng.

SELFDESTRUCT có thể xóa hợp đồng để triển khai lại bằng CREATE2 không?

Quy tắc Ethereum hiện tại thường giữ nguyên mã và dữ liệu lưu trữ của các hợp đồng đã tồn tại ổn định, nên phương thức nâng cấp dài hạn bằng cách hủy rồi triển khai lại không còn hoạt động.

Hợp đồng metamorphic là gì?

Hợp đồng metamorphic là thiết kế cũ nhằm thay đổi mã tại một địa chỉ thông qua việc hủy hợp đồng và triển khai lại theo cách xác định trước.

CREATE2 có tốn nhiều gas hơn CREATE không?

Ngoài chi phí tạo hợp đồng, bộ nhớ, constructor và lưu mã thông thường, CREATE2 còn tốn chi phí hash mã khởi tạo.

CREATE2 có thể tạo địa chỉ tùy biến không?

Có. Nhà phát triển có thể thử nhiều salt cho đến khi địa chỉ dự kiến có mẫu hình mong muốn.

Địa chỉ CREATE2 tùy biến có tăng bảo mật không?

Không. Tiền tố hoặc hậu tố dễ nhận biết không chứng minh mã an toàn, quyền sở hữu hay tính xác thực.

Vì sao địa chỉ CREATE2 dự kiến của tôi khác địa chỉ khi triển khai?

Các nguyên nhân thường gặp gồm chọn sai factory, mã hóa salt, đầu ra compiler, thư viện được liên kết, tham số constructor hoặc nhầm bytecode tạo hợp đồng với bytecode thời gian chạy.

Làm cách nào xác minh một lần triển khai CREATE2?

Tính lại địa chỉ từ các đầu vào chính xác và so sánh mã thời gian chạy, dữ liệu lưu trữ, chủ sở hữu, bản triển khai và sự kiện với giá trị dự kiến.

Kết luận

Triển khai xác định trước bằng CREATE2 cho phép tính địa chỉ hợp đồng thông minh tương thích Ethereum trước khi hợp đồng tồn tại on-chain.

Địa chỉ được tạo từ tiền tố cố định, địa chỉ factory CREATE2, salt 32 byte và hash của mã khởi tạo.

Tham số constructor, đầu ra compiler, thư viện được liên kết và thiết lập bản dựng có thể làm thay đổi mã khởi tạo, từ đó làm thay đổi địa chỉ.

CREATE2 hỗ trợ tài khoản thông minh counterfactual, state channel, tài khoản gắn với token, thành phần ứng dụng có thể dự đoán và triển khai đa chuỗi cùng địa chỉ.

Địa chỉ dự đoán có thể nhận tiền mã hóa trước khi triển khai, nhưng tài sản có thể không truy cập được nếu không thể tạo hợp đồng dự kiến.

Muốn có cùng địa chỉ trên nhiều mạng cần dùng cùng factory, salt và hash mã khởi tạo; điều này không tự động đảm bảo mã, trạng thái hoặc bảo mật giống nhau.

Nhà phát triển cũng cần bảo vệ các hàm khởi tạo, tránh constructor phụ thuộc vào môi trường, xác minh hoạt động của factory và tính đến rủi ro front-running.

Quy tắc SELFDESTRUCT hiện tại của Ethereum ngăn các hệ thống nâng cấp thông thường dựa trên việc hủy hợp đồng tồn tại lâu dài rồi tạo lại tại cùng địa chỉ.

Vì vậy, nên xem CREATE2 là công cụ suy ra địa chỉ và triển khai, chứ không phải giải pháp bảo mật hay nâng cấp tự động.

Khi đầu vào, factory, bytecode và quy trình khởi tạo được xác minh cẩn thận, CREATE2 tạo nền tảng mạnh mẽ cho các ứng dụng tiền mã hóa có địa chỉ dễ dự đoán và trải nghiệm thuận tiện hơn.
BTC ETFs See $679M in Outflows
BTC ETFs See $679M in OutflowsBTC ETFs See $679M in Outflows
Citi sees BTC at $113K. What do institutions see?