trừu tượng
tiêu đề phụ
Bài viết này xoay quanh giao thức ERC721 tiêu chuẩn, mô tả cách Mint, safeMint, chuyển giao, v.v. thực hiện quản lý tài sản và hiểu thiết kế bảo mật cũng như thành phần chi phí của chuỗi dữ liệu Ethereum bằng cách diễn giải mã.
phác thảo thư mục
phác thảo thư mục
1. Cái gọi là tài sản NFT là gì?
chữ
chữ
chữ
5. Dung lượng lưu trữ trên Ethereum đắt như thế nào?
tiêu đề phụ
hướng đối tượng
Nghiên cứu và phát triển - có thể đọc mà không có rào cản, hiểu thiết kế hợp đồng tinh tế
Non-RD - có thể không hiểu các mã được liệt kê, nhưng có thể hiểu ý tưởng thiết kế của các giao thức tiêu chuẩn
tiêu đề cấp đầu tiên
Trên opensea, bạn có thể thấy rằng mỗi NFT có một số duy nhất.
Ví dụ: số 4132 trong sê-ri azuki, trong cột Chi tiết của trang, bạn có thể thấy địa chỉ hợp đồng, số ID, chuỗi công khai nơi nó được triển khai và thông tin khác, trong khi cột Thuộc tính là cài đặt của nó với các thuộc tính khác nhau và độ hiếm tương ứng (bản thân Azuki không mang, nhưng nó được tính bằng tích hợp Opensea).
tiêu đề phụ
Và khi chúng ta xem lại mã nguồn (lấy mã openzepplin của thư viện chuẩn ERC721 ở đây), chúng ta sẽ thấy rằng chương trình ghi lại hai biến kiểu từ điển toàn cầu và ghi lại tất cả các ID tương ứng hiện tại của mỗi ID trong _owners bằng cách ánh xạ địa chỉ với số. Hoặc, nó cũng ghi lại tổng số NFT do chủ sở hữu hiện tại nắm giữ với _balances
Và bởi vì ERC721 cung cấp một biến _owners một cách sáng tạo với ID tương ứng với địa chỉ, nó quản lý địa chỉ và số dư chỉ với _balances ERC20, phân biệt sự khác biệt giữa FT (đồng nhất) và NFT (không đồng nhất).
tiêu đề cấp đầu tiên
2.1 Cách thức hoạt động của MintKhi NFT của Netflix quên bảo mật kinh doanh của web2
Mint có nghĩa là đúc, là quá trình tạo ra mỗi NFT, chẳng hạn như NFT Love Death Machine trước đây
Khi NFT của Netflix quên bảo mật kinh doanh của web2
Mint đã nhận được chứng chỉ tài sản của NFT.
Như có thể thấy từ mã nguồn, Mint chủ yếu đưa ra các đánh giá bảo mật:
Phán quyết 2: Đảm bảo rằng NFTID do sàn giao dịch này vận hành không tồn tại
Mã cuối cùng làm gì là:
Thao tác 1: Cộng 1 vào tổng số _balances được giữ bởi địa chỉ đã chuyển
Phán đoán 1: Đảm bảo rằng địa chỉ chuyển vào không phải là 0x00 (không thể chuyển địa chỉ lỗ đen ra ngoài và việc chuyển vào sẽ dẫn đến mất tài sản)
Thao tác 2: Sửa đổi chủ sở hữu của NFTID tương ứng thành địa chỉ được chuyển
Thao tác 3: Khi giao dịch hoàn tất, một sự kiện phát ra sẽ được gửi, cho phép hệ thống ngoại tuyến giám sát dữ liệu của giao dịch này
Ở giữa có _beforeTokenTransfer và _afterTokenTransfer, là các chức năng ảo, theo tiêu chuẩn, chúng được phía dự án sử dụng để thêm một số mã logic cụ thể mà không cần sửa đổi giao thức tiêu chuẩn.
2.2 Tại sao safeMint an toàn hơn
safeMint có nghĩa là truyền an toàn.Từ việc triển khai mã, có thể thấy rằng nó cũng tự gọi MInt, nhưng nó bổ sung thêm phán đoán của _checkOnERC721Received, thuộc tiêu chuẩn ERC165, tương đương với việc phán đoán bên kia sau khi thao tác chuyển là đã hoàn thành. Cho dù địa chỉ là địa chỉ lỗ đen (nghĩa là địa chỉ không thể bắt đầu hoạt động NFT giao dịch) là để ngăn chặn khi đối tượng chuyển là địa chỉ hợp đồng và hợp đồng không có chức năng chuyển được đặt trước, dẫn đến trong tài sản không thể chuyển đi, dẫn đến tổn thất vĩnh viễn.https://eips.ethereum.org/EIPS/eip-165
2.3 ERC165 ngăn tài sản bị chuyển vào lỗ đen như thế nào?
Ý định ban đầu của thiết kế có thể được nhìn thấy:
Đó là một đề xuất để chuẩn hóa giao diện hợp đồng. Trong ngữ pháp lập trình, giao diện có nghĩa là giao diện. Các chức năng được xác định trong đó không thể được thực hiện và chỉ đặt các tham số liên quan đến tên chức năng. Khi chương trình phức tạp, nó tương đương với một thư mục để cho người khác biết những gì tôi có Function.
Tuy nhiên, các phương thức viết của giao diện đều có ưu và nhược điểm riêng, tên xác định loại tham số và thậm chí liệu nó có tồn tại hay không.
Do đó, đề xuất này cuối cùng đã hình thành tiêu chuẩn ERC165, chuẩn hóa các quy tắc nhận dạng của giao diện.
Quá trình sử dụng là:
BƯỚC 1 Xác định xem có chức năng supportsInterface hay không và nó tuân theo tiêu chuẩn 165
(PS: Hãy để hợp đồng có chức năng nhận và chuyển NFT, có thể thực hiện chức năng này bằng cách giới thiệu gói mở rộng IERC721Receiver.sol)
chữ
Thiết kế giao thức tiêu chuẩn có hai phương thức truyền, truyền và truyềnTừ, được sử dụng trong hai trường hợp:
chuyển Chuyển: Được gọi bởi người dùng để chuyển NFTID được giữ bởi ví gửi tin nhắn này đến địa chỉ được chỉ định
So sánh nó với:
transferFrom Chuyển từ: Được gọi bởi một tổ chức nào đó, trước tiên người dùng cần ủy quyền cho một địa chỉ nhất định để nó có quyền chuyển.
So sánh nó với:
Chuyển khoản là một giao dịch tiền mặt, thanh toán bằng tiền túi của bạn
transferFrom là quét mã để khấu trừ tiền và cửa hàng sẽ áp dụng khoản khấu trừ, tùy thuộc vào việc người dùng có mở quyền giữ lại số tiền nhỏ hay không
Tiếp theo, chúng ta hãy xem mã, có thể có các chi tiết không mong muốn.
3.1 Cách thức hoạt động của quá trình chuyển tiền
Anh ta sẽ phát hiện xem bên từ của giao dịch hiện tại có phải là chủ sở hữu của NFTID này hay không và hạn chế NFT được chuyển đến địa chỉ 0x00. Tiếp theo, làm mới số dư của địa chỉ chuyển đi và địa chỉ chuyển vào, sửa đổi biến toàn cục _balances và đặt lại _owners để thay đổi địa chỉ chủ sở hữu của NFTID này thành thành.
Đây là một chi tiết bảo vệ. Trước tiên, hãy thực thi _approve(address(0), tokenId); để xóa ủy quyền lịch sử. Nếu không có bước như vậy, quá trình chuyển tài sản đã hoàn tất, nhưng ủy quyền chuyển NFTID của nó vẫn còn đó. Hãy suy nghĩ cẩn thận:
3.2 Cách hoạt động của transferFrom
Bản chất của giao dịch ở đây gọi _safeTransfer, vì vậy logic cốt lõi của nó là phần yêu cầu,
Một chi tiết quan trọng ở đây là: _msgSender() Đây là một phương thức trong thư viện chuẩn của openzepplin Context.sol.
Trên thực tế, nó là để lấy địa chỉ người gửi của giao dịch hiện tại, nhưng phiên bản đóng gói được sử dụng ở đây thay vì sử dụng trực tiếp msg.sender
Do đó, một số hợp đồng ở giữa, tương tự như thư viện, cần xem xét tình huống đặc biệt này.
Phần còn lại của bản án là xác định xem có biên bản ủy quyền hay không, dễ hiểu và sẽ không bị lặp lại
tiêu đề cấp đầu tiên
4. Dữ liệu nào khác có thể được lưu trữ trên chuỗi?
Sau khi đọc liên kết giao dịch, nhiều sinh viên mới đã thực sự ngạc nhiên, hóa ra NFT tôi mua chỉ có một ID có địa chỉ ghi công trỏ đến tôi, do đó đạt được tính duy nhất. Mặc dù vậy, thông tin hiếm ở đâu? Bản thân hình ảnh NFT của tôi ở đâu?
Đây là phần mở rộng siêu dữ liệu IERC721Metadata.sol liên quan đến ERC721
Bạn có thể đặt bất cứ thứ gì bạn muốn, nhưng bên dự án thường chỉ lưu trữ địa chỉ ID+IPFS cơ bản nhất trên chuỗi.
Chúng ta có thể xem một số dữ liệu dự án thông qua phương pháp hướng dẫn Etherscan trước đây?
Địa chỉ hợp đồng trên Azuki là: 0xed5af388653567af2f388e6224dc7c4b3241c544
Đối với các dự án Metaverse mới nổi gần đây Metaverse land sandbox và **Decentraland, cũng như **Axie Infinity rực lửa năm ngoái, siêu dữ liệu cơ bản được lưu trữ trên chuỗi chỉ là ID+URL.
Những thứ giống như gương được thiết kế đặc biệt để có chi phí thấp và dung lượng lưu trữ cao.Một khối thường bắt đầu ở mức 30M, gấp khoảng 1000 lần so với Ethereum.
tiêu đề cấp đầu tiên
5. Dung lượng lưu trữ trên Ethereum đắt như thế nào?
Đây là nơi mà bài viết này là một chút khó khăn hơn. Hãy phân tích thành phần chi phí và chuyển đổi số lượng lưu trữ trên chuỗi từ mã nguồn
Sẽ có hai khía cạnh của việc phát sinh chi phí, theo quy trình thực hiện
Khi người dùng bắt đầu giao dịch, dữ liệu được ghi trên chuỗi sẽ được chuyển vào dưới dạng tham số và kích thước của nó là chi phí
Giao dịch thực thi mã hợp đồng và EVM tính toán chi phí gas tiêu thụ theo việc sửa đổi và sử dụng.
5.1 Chi phí khởi tạo giao dịch
Chúng ta có thể kiểm tra Ethereum Yellow Paper, trong đó có định nghĩa rõ ràng về gas được tiêu thụ bởi kích thước dữ liệu giao dịch
Bạn có thể xem giá của các thông số kèm theo khi trao đổi:
Mỗi giao dịch có 21000 GAS để thanh toán
Trả 68 GAS cho mỗi dữ liệu hoặc mã byte khác không của giao dịch
Trả 4 GAS cho mỗi dữ liệu hoặc mã 0 byte của giao dịch
Vì vậy, nếu bạn đăng ký một số thông tin thuộc tính NFT trong Mint, phần dữ liệu của giao dịch sẽ chuyển đổi các ký tự như abc thành hai biểu diễn thập lục phân và mỗi ký tự là một nhị phân tám bit, tương đương với một byte. Vì vậy, nó có thể xấp xỉ bằng cách chia độ dài của dữ liệu cho 2 dưới dạng số byte.
Và 1kb dữ liệu, nếu tất cả đều là thông tin văn bản khác không với nội dung thông tin, thì tương đương với việc tăng mức tiêu thụ gas là 68*1000=6,8W. Theo giá gas của 20gwei và giá của 2000 eth đổi lấy đô la Mỹ, có thể ước tính rằng cứ 1kb dữ liệu trên chuỗi cần phải:
20*(21000+68000)*1e9/1e18 * 2000 = 3,5 USD
func gasSStore(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64)(uint64, error)
5.2 Chi phí lưu trữ hợp đồng
Vì có logic được lưu trữ trong hợp đồng thông minh sau khi giao dịch được bắt đầu, hãy phân tích mức tiêu thụ cụ thể từ mã nguồn của Ethereum go (EIP1283).
Trong lịch sử, ước tính mức tiêu thụ gas đã trải qua nhiều lần lặp lại. Nếu Petersburg hoặc Constantinople không được kích hoạt, phép tính sẽ không được thực hiện theo logic sau
Tính toán mức tiêu thụ gas phụ thuộc vào 3 loại quản lý dữ liệu (thêm, xóa, sửa đổi)
Từ một địa chỉ có giá trị bằng không đến một giá trị khác không (GIÁ TRỊ MỚI), mỗi khe lưu trữ tiêu thụ 2Wgas
Từ địa chỉ có giá trị khác không đến địa chỉ có giá trị bằng không (XÓA), mỗi khe lưu trữ cần tiêu thụ 5K gas, nhưng sẽ có phần thưởng là 1,5W gas hoàn trả
Từ khác không đến khác không (CHANGE), mỗi khe lưu trữ tiêu thụ 200 gas
Lưu ý rằng mỗi khe lưu trữ ở trên được tính là 32 byte và dung lượng lưu trữ 1kb là 32 khe lưu trữ. Quy trình của Mint là thêm bộ nhớ mới, vì vậy nếu thêm 1kb dữ liệu được lưu trữ trên chuỗi, chi phí sẽ là 64Wgas và số tiền chuyển đổi là:
EIP-5058 có thể ngăn các bên tham gia dự án NFT chạy trốn với các thùng không?
EIP-5058 có thể ngăn các bên tham gia dự án NFT chạy trốn với các thùng không?