抽象的
本文介绍了 Metacube 中使用的交易批处理程序,用于即时发送玩家赚取的 NFT。它解释了批处理程序基于参与者的可扩展架构,并提供了 Go 中的详细实现。
所有代码片段都可以在关联的 GitHub 存储库中找到。
建筑学
巴彻由两位主要演员组成:
- Builder 接收交易,将它们批处理成单个多调用交易,并将其发送给 Sender actor。
- 发送者使用适当的字段(随机数、最大费用等)完成交易,对其进行签名,将其发送到 Starknet 网络,并监控其状态。
这种参与者分离可以实现可扩展且高效的批处理程序。构建器在发送者发送交易时准备交易,从而实现连续且高效的交易流。
执行
以下实现特定于 Go,但这些概念可以轻松适应其他语言,因为功能保持不变。
此外,请注意,此实现特定于从同一合约发送 NFT。然而,本文后面提到了一种更通用的方法。
最后,代码基于Nethermind开发的starknet.go库。
批处理机
让我们从 Batcher 本身开始:
type Batcher struct { accnt *account.Account contractAddress *felt.Felt maxSize int inChan <p>账户(accnt)是持有NFT的账户,它将用于签署转移NFT的交易。这些 NFT 是同一合约的一部分,因此有合约地址字段。 maxSize 字段是批次的最大大小,inChan 是将事务发送到 Batcher 的通道。 failChan 用于发回发送失败的交易。</p> <p>请注意,在这个实现中,后面所说的交易数据([]string)是一个由两个元素组成的数组:接收者地址和 NFT ID。</p> <p>Batcher 同时运行 Builder 和 Sender Actor:<br> </p> <pre class="brush:php;toolbar:false">type TxnDataPair struct { Txn rpc.BroadcastInvokev1Txn Data [][]string } func (b *Batcher) Run() { txnDataPairChan := make(chan TxnDataPair) go b.runBuildActor(txnDataPairChan) go b.runSendActor(txnDataPairChan) }
定义的通道 txnDataPairChan 将交易数据对从 Builder 发送到 Sender。每个交易数据对都包含批量交易,每个交易的数据都嵌入其中。每笔交易的数据都与批量交易一起发送,以便失败的交易可以被发送回实例化 Batcher 的实体。
建设者
让我们分析一下Build actor。请注意,为了更好的可读性,代码已被简化(完整代码):
type Batcher struct { accnt *account.Account contractAddress *felt.Felt maxSize int inChan <p>runBuildActor 函数是 Builder actor 的事件循环。它等待事务发送到批处理程序,并在批处理已满或达到超时时构建批处理事务。然后批量交易被发送到 Sender actor。</p> <h3> 发件人 </h3> <p>现在让我们分析一下Sender actor。请注意,为了更好的可读性,代码已被简化(完整代码):<br> </p> <pre class="brush:php;toolbar:false">type TxnDataPair struct { Txn rpc.BroadcastInvokev1Txn Data [][]string } func (b *Batcher) Run() { txnDataPairChan := make(chan TxnDataPair) go b.runBuildActor(txnDataPairChan) go b.runSendActor(txnDataPairChan) }
runSendActor 函数是发送者 Actor 的事件循环。它等待 Builder 发送批量交易,对它们进行签名,将它们发送到 Starknet 网络,并监控它们的状态。
关于费用估算的说明:可以在发送之前估算批量交易的费用成本。交易签名后可添加以下代码:
// This function builds a function call from the transaction data. func (b *Batcher) buildFunctionCall(data []string) (*rpc.FunctionCall, error) { // Parse the recipient address toAddressInFelt, err := utils.HexToFelt(data[0]) if err != nil { ... } // Parse the NFT ID nftID, err := strconv.Atoi(data[1]) if err != nil { ... } // The entry point is a standard ERC721 function // https://docs.openzeppelin.com/contracts-cairo/0.20.0/erc721 return &rpc.FunctionCall{ ContractAddress: b.contractAddress, EntryPointSelector: utils.GetSelectorFromNameFelt( "safe_transfer_from", ), Calldata: []*felt.Felt{ b.accnt.AccountAddress, // from toAddressInFelt, // to new(felt.Felt).SetUint64(uint64(nftID)), // NFT ID new(felt.Felt).SetUint64(0), // data -> None new(felt.Felt).SetUint64(0), // extra data -> None }, }, nil } // This function builds the batch transaction from the function calls. func (b *Batcher) buildBatchTransaction(functionCalls []rpc.FunctionCall) (rpc.BroadcastInvokev1Txn, error) { // Format the calldata (i.e., the function calls) calldata, err := b.accnt.FmtCalldata(functionCalls) if err != nil { ... } return rpc.BroadcastInvokev1Txn{ InvokeTxnV1: rpc.InvokeTxnV1{ MaxFee: new(felt.Felt).SetUint64(MAX_FEE), Version: rpc.TransactionV1, Nonce: new(felt.Felt).SetUint64(0), // Will be set by the send actor Type: rpc.TransactionType_Invoke, SenderAddress: b.accnt.AccountAddress, Calldata: calldata, }, }, nil } // Actual Build actor event loop func (b *Batcher) runBuildActor(txnDataPairChan chan= b.maxSize { // The batch is full, trigger the building trigger = true } // We don't want a smaller batch to wait indefinitely to be full, so we set a timeout to trigger the building even if the batch is not full case 0 { trigger = true } } if trigger { builtTxn, err := b.buildBatchTransaction(functionCalls) if err != nil { ... } else { // Send the batch transaction to the Sender txnDataPairChan <p>这可能有助于确保在发送交易之前费用不会太高。如果估计费用高于预期,则可能还需要重新调整交易的最大费用字段。但请注意,当交易发生任何更改时,必须重新签名!</p> <p>但是请注意,如果交易吞吐量相当高,您在估算费用时可能会遇到一些问题。这是因为当给定的交易刚刚被批准时,更新帐户的随机数会有一点延迟。因此,在估计下一笔交易的费用时,它可能会失败,认为随机数仍然是前一笔交易。因此,如果您仍然想估算费用,那么您可能需要在每笔交易之间提供一些睡眠以避免此类问题。</p> <h2> 迈向通用批处理机 </h2> <p>所提供的批处理程序专门用于从同一合约发送 NFT。然而,该架构可以轻松适应发送任何类型的交易。</p> <p>首先,发送到 Batcher 的交易数据必须更加通用,因此包含更多信息。它们必须包含合约地址、入口点选择器和调用数据。然后必须调整 buildFunctionCall 函数来解析此信息。</p> <p>还可以更进一步,将发件人帐户设为通用。这将需要更多的重构,因为必须针对每个发送者帐户对交易进行批处理。然而,它是可行的,并且可以实现更通用的批处理机。</p> <p>但是,请记住,过早的优化是万恶之源。因此,如果您只需要发送 NFT 或特定代币(例如 ETH 或 STRK),那么提供的批处理程序就足够了。</p> <h2> 命令行工具 </h2> <p>存储库代码可以用作 CLI 工具来批量发送一堆 NFT。该工具易于使用,阅读本文后您应该能够根据您的需要进行调整。请参阅 README 了解更多信息。</p><h2> 结论 </h2> <p>我希望这篇文章可以帮助您更好地了解Metacube如何向其玩家发送NFT。批处理程序是一个关键的基础设施组件,我们很高兴与社区分享它。如果您有任何问题或反馈,请随时发表评论或与我联系。感谢您的阅读!</p>
以上是Starknet 交易批量处理程序的详细内容。更多信息请关注PHP中文网其他相关文章!

掌握Go语言中的strings包可以提高文本处理能力和开发效率。1)使用Contains函数检查子字符串,2)用Index函数查找子字符串位置,3)Join函数高效拼接字符串切片,4)Replace函数替换子字符串。注意避免常见错误,如未检查空字符串和大字符串操作性能问题。

你应该关心Go语言中的strings包,因为它能简化字符串操作,使代码更清晰高效。1)使用strings.Join高效拼接字符串;2)用strings.Fields按空白符分割字符串;3)通过strings.Index和strings.LastIndex查找子串位置;4)用strings.ReplaceAll进行字符串替换;5)利用strings.Builder进行高效字符串拼接;6)始终验证输入以避免意外结果。

thestringspackageingoisesential forefficientstringManipulation.1)itoffersSimpleyetpoperfulfunctionsFortaskSlikeCheckingSslingSubstringsStringStringsStringsandStringsN.2)ithandhishiCodeDewell,withFunctionsLikestrings.fieldsfieldsfieldsfordsforeflikester.fieldsfordsforwhitespace-fieldsforwhitespace-separatedvalues.3)3)

WhendecidingbetweenGo'sbytespackageandstringspackage,usebytes.Bufferforbinarydataandstrings.Builderforstringoperations.1)Usebytes.Bufferforworkingwithbyteslices,binarydata,appendingdifferentdatatypes,andwritingtoio.Writer.2)Usestrings.Builderforstrin

Go的strings包提供了多种字符串操作功能。1)使用strings.Contains检查子字符串。2)用strings.Split将字符串分割成子字符串切片。3)通过strings.Join合并字符串。4)用strings.TrimSpace或strings.Trim去除字符串首尾的空白或指定字符。5)用strings.ReplaceAll替换所有指定子字符串。6)使用strings.HasPrefix或strings.HasSuffix检查字符串的前缀或后缀。

使用Go语言的strings包可以提升代码质量。1)使用strings.Join()优雅地连接字符串数组,避免性能开销。2)结合strings.Split()和strings.Contains()处理文本,注意大小写敏感问题。3)避免滥用strings.Replace(),考虑使用正则表达式进行大量替换。4)使用strings.Builder提高频繁拼接字符串的性能。

Go的bytes包提供了多种实用的函数来处理字节切片。1.bytes.Contains用于检查字节切片是否包含特定序列。2.bytes.Split用于将字节切片分割成smallerpieces。3.bytes.Join用于将多个字节切片连接成一个。4.bytes.TrimSpace用于去除字节切片的前后空白。5.bytes.Equal用于比较两个字节切片是否相等。6.bytes.Index用于查找子切片在largerslice中的起始索引。

theEncoding/binarypackageingoisesenebecapeitProvidesAstandArdArdArdArdArdArdArdArdAndWriteBinaryData,确保Cross-cross-platformCompatibilitiational and handhandlingdifferentendenness.itoffersfunctionslikeread,写下,写,dearte,readuvarint,andwriteuvarint,andWriteuvarIntforPreciseControloverBinary


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

记事本++7.3.1
好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境