opensea 拍卖智能合约如何在不存储以太币的情况下工作

Dum*_*ail 5 ethereum solidity smartcontracts nft opensea

试图了解 opensea “出价”的工作原理。每当任何有兴趣的买家想要购买 NFT 时,他们都必须创建一个报价,其中他们基本上签署一条消息(承诺)(这不花费汽油费)。我不明白这件事在幕后是如何运作的。如果,比方说,我出价 3 天,并且我赢得了出价或卖家接受了出价,而我当时没有所需的以太币(出价金额),那么会发生什么?

拍卖智能合约基本上以投标人金额作为质押,当拍卖结束时,如果用户没有赢得拍卖,则将质押的以太币转回,但在上述质押以太+支付交易费用的过程中,这些额外的开销都是存在的。

Opensea 不跟踪竞价金额的质押,因此用户无需支付交易费 + 质押以太币。但他们要求用户签名确认出价。谁能解释一下技术上发生了什么?

我也浏览了下面的链接,但这并没有回答 opensea 是如何工作的。

链接1:https://ethereum.stackexchange.com/questions/102660/creating-an-auction-smart-contract-without-storing-the-ether

链接2:https ://ethereum.stackexchange.com/questions/110749/auction-data-on-chain-or-off-chain

在链接 2 中,他们提到“承诺是通过签署‘消息’创建的。这些是链下交易。但是,取消交易需要在链上发布。” 但它实际上是如何运作的呢?

小智 1

我将解释 Opensea 的最新版本(称为 Seaport)的工作原理(文档)

如果,比方说,我出价 3 天,并且我赢得了出价或卖家接受了出价,而我当时没有所需的以太币(出价金额),那么会发生什么?

简单来说,您的报价将无法实现。Opensea 的 UI 应该过滤掉无法履行的报价,这样它们就不会被接受。如果错误地接受了报价,不会发生任何不好的事情,交易只会失败并且不会转移任何代币。

智能合约的工作不是存储报价,而是验证报价是否有效并相应地转移代币。

这可能会让人感到惊讶,但合约上存储的唯一数据是以下映射

// Track status of each order (validated, cancelled, and fraction filled).
mapping(bytes32 => OrderStatus) private _orderStatus;

// Only orders signed using an offerer's current counter are fulfillable.
mapping(address => uint256) private _counters;
Run Code Online (Sandbox Code Playgroud)

第一个映射确保订单无法多次履行或被取消。(订单通过其bytes32哈希值来识别)。

第二个映射为每个报价者保存一个计数器。每个优惠都有一个counter参数必须匹配_counters[offerer],否则无效。这是取消所有现有优惠的明智方法,因为您有“全部取消”功能,只需增加您的_counters.

这应该已经回答了为什么取消订单需要进行链上交易。因为没有什么能保证链外的每个人都会忘记某个报价。

Opensea 不跟踪竞价金额的质押,因此用户无需支付交易费 + 质押以太币。但他们要求用户签名确认出价。谁能解释一下技术上发生了什么?

“出价确认”是使流程不可信所必需的钱包签名(EIP-712)。没有人能够通过伪造报价来窃取代币。唯一可信的假设是 Opensea 不会隐藏买家/卖家的报价。