跳到主要内容

content

import "github.com/bsv8/go-bitfs/content"

索引​

常量​

BlockSize 与 DigestSize 是 MasterSeed 依赖库拥有的协议常量;本包仅按 协议引用它们。

const (
// BlockSize 是一个完整内容块的字节数(256 KiB)。
BlockSize uint64 = masterseed.BlockSize
// DigestSize 是 seed 摘要的字节宽度。
DigestSize = masterseed.DigestSize
)

MaxContentBatchItems 是一条 003 授权或一个 004 交付包允许携带的内容条目数。

该上限是协议真值:content_hashes 与 content_payloads 子 CBOR 数组长度必须 在 1 到 64 之间。超过 64 个内容时,调用方必须拆成多个连续付款序号的 003 批次;SDK 不做自动拆分、截断或去重。

const MaxContentBatchItems = 64

MaxContentPayloadsCBORBytes 是 004 中 content_payloads_cbor 子文档的最大字节数。

公式为 MaxContentBatchItems*(masterseed.BlockSize+9)+9:每个最大长度的 bstr 条目占用 BlockSize 字节加最多 9 字节的 CBOR 头部,外加最多 9 字节的 数组头部。在解码子数组之前先按该上限拒绝超长输入,防止单个恶意 bstr 绕过 数组数量限制。它是 SDK 的协议上限,不是部署层的 HTTP body 或消息配额; 应用仍必须设置不高于自身可承受能力的资源上限。

const MaxContentPayloadsCBORBytes = MaxContentBatchItems*(int(masterseed.BlockSize)+9) + 9

MaxQuoteFileSize 是在一个 BitFS 载荷中交付种子时,报价可以描述的最大文件大小。

const MaxQuoteFileSize uint64 = MaxQuoteSeedBlocks * BlockSize

MaxQuoteSeedBlocks 是种子仍能放入 BitFS 载荷限制内时允许的最大区块数。种子为每个区块包含一个 32 字节哈希。

const MaxQuoteSeedBlocks uint64 = masterseed.BlockSize / masterseed.DigestSize

函数 CheckContentRequestTiming​

func CheckContentRequestTiming(authorization *PaymentAuthorization, quoteTerms *FileQuoteTerms, at time.Time) error

CheckContentRequestTiming 应用 003 请求的两项显式时间比较:报价过期与交付 截止。at 是调用方显式传入的本操作唯一时间事实。

函数 ContentHashesPriceSatoshis​

func ContentHashesPriceSatoshis(ctx context.Context, terms *FileQuoteTerms, contentHashes [][]byte, seed []byte) (uint64, error)

ContentHashesPriceSatoshis 基于已验证报价推导一批有序内容哈希的买方签名累计金额。等于报价 SeedHash 的哈希按 SeedPriceSatoshis 计价;其余每个哈希必须能在已验证 seed 中找到,并按其位置的协议期望长度计价(整块按 FullBlockPriceSatoshis,尾块按比例进位并享受规定的 10% 卖方让利)。同一哈希背后的重复块位置只计费一次;期望长度相互矛盾的匹配将拒绝整批。总额使用检查加法累加,任何溢出都会在签名之前失败而不是回绕。

函数 DecodeContentDeliveryDocument​

func DecodeContentDeliveryDocument(data []byte) (protocol.PaymentAuthorizationID, error)

DecodeContentDeliveryDocument 严格解码 content_delivery_cbor 并返回它提交到的付款授权 ID。

函数 DecodeContentHashes​

func DecodeContentHashes(raw []byte) ([][]byte, error)

DecodeContentHashes 严格解码 content_hashes 子文档。它通过要求与确定性重新编码逐字节相等,拒绝不定长、tag、尾随数据、非规范编码、错误数量、错误哈希宽度、重复项以及重排尝试。返回的切片是归调用方所有的深复制。

函数 DecodeContentPayloads​

func DecodeContentPayloads(raw []byte) ([][]byte, error)

DecodeContentPayloads 按照 DecodeContentHashes 相同的规范性规则严格解码 content_payloads 子文档,并额外检查每项非空与最大长度。超过 MaxContentPayloadsCBORBytes 的输入会在解码前被拒绝,使恶意长度无法绕过条目数限制。返回的切片是归调用方所有的深复制。

函数 DecodeSupportedArbiterPublicKeys​

func DecodeSupportedArbiterPublicKeys(data []byte) ([][]byte, error)

DecodeSupportedArbiterPublicKeys 校验并解码规范的 supported-arbiter 子结构。

函数 EncodeContentDeliveryDocument​

func EncodeContentDeliveryDocument(paymentAuthorizationID protocol.PaymentAuthorizationID) ([]byte, error)

EncodeContentDeliveryDocument 返回精确规范的一元 content_delivery_cbor 认证文档:[payment_authorization_id]。

函数 EncodeContentHashes​

func EncodeContentHashes(hashes [][]byte) ([]byte, error)

EncodeContentHashes 返回 003 content_hashes 子文档的唯一规范表示:由 1..MaxContentBatchItems 个唯一、有序的 32 字节哈希组成的数组,编码为确定性 CBOR 字节串。

函数 EncodeContentPayloads​

func EncodeContentPayloads(payloads [][]byte) ([]byte, error)

EncodeContentPayloads 返回 004 content_payloads 子文档的唯一规范表示:由 1..MaxContentBatchItems 个非空 payload 组成的数组,每项不超过 masterseed.BlockSize 字节。

函数 EncodeFileQuoteTerms​

func EncodeFileQuoteTerms(terms *FileQuoteTerms) ([]byte, error)

EncodeFileQuoteTerms 返回卖方签名的精确规范 CBOR 字节。认证文档只包含业务字段;版本和 Kind 只存在于外层 [1, 1, ...] wire 报文中。

函数 EncodePaymentAuthorization​

func EncodePaymentAuthorization(authorization *PaymentAuthorization) ([]byte, error)

EncodePaymentAuthorization 返回 Kind 5 请求中买方签名的精确确定性 CBOR 字节:六元业务字段数组。

函数 EncodeSignedContentDelivery​

func EncodeSignedContentDelivery(delivery *SignedContentDelivery) ([]byte, error)

EncodeSignedContentDelivery 编码完整的 Kind 6 wire 报文:[1, 6, content_delivery_cbor, seller_content_delivery_signature, content_payloads_cbor]。

函数 EncodeSignedContentRequest​

func EncodeSignedContentRequest(request *SignedContentRequest) ([]byte, error)

EncodeSignedContentRequest 编码完整的 Kind 5 wire 报文:[1, 5, payment_authorization_cbor, buyer_payment_authorization_signature]。

函数 EncodeSignedFileQuote​

func EncodeSignedFileQuote(quote *SignedFileQuote) ([]byte, error)

EncodeSignedFileQuote 返回完整的 Kind 1 wire 报文:[1, 1, terms_cbor, seller_public_key, seller_file_quote_terms_signature]。

函数 EncodeSupportedArbiterPublicKeys​

func EncodeSupportedArbiterPublicKeys(publicKeys [][]byte) ([]byte, error)

EncodeSupportedArbiterPublicKeys 返回 supported-arbiter 子结构唯一允许的表示形式。

函数 FileQuoteTermsID​

func FileQuoteTermsID(termsCBOR []byte) (protocol.FileQuoteTermsID, error)

FileQuoteTermsID 返回 exact 规范报价条款的 SHA-256。它位于 Kind 1 文档 ID 命名空间内,把后续每一笔付款授权锚定到同一份报价。

函数 PaymentAuthorizationID​

func PaymentAuthorizationID(paymentAuthorizationCBOR []byte) (protocol.PaymentAuthorizationID, error)

PaymentAuthorizationID 校验规范的付款授权 CBOR 并返回其 SHA-256 摘要。它只定义在 exact payment_authorization_cbor 之上,并与该文档共享命名空间。

函数 SanitizeRecommendedFilename​

func SanitizeRecommendedFilename(name string) string

SanitizeRecommendedFilename 把卖方提供的展示名转换成安全的单一文件名。卖方必须在编码和签署条款之前应用它;接收方用同一规则拒绝任何未在上游 sanitize 的字段,而不是静默改写已签名字节。

函数 ValidateFileQuoteTerms​

func ValidateFileQuoteTerms(terms *FileQuoteTerms) error

ValidateFileQuoteTerms validates quote terms without considering time or a seller signature. The recommended filename must already satisfy the single sanitize rule: sellers sanitize before encoding and signing, buyers only verify that the received field obeys the same rule and never rewrite it. 所有导出失败分支都返回结构化 invalid_evidence/malformed_wire 分类错误, 调用方可用 protocol.CodeOf 稳定分支。

函数 ValidatePaymentAuthorization​

func ValidatePaymentAuthorization(authorization *PaymentAuthorization) error

ValidatePaymentAuthorization 在签名前检查 Kind 5 字段宽度、费用池引用、目标付款序号边界、规范内容哈希批次和交付截止时间。

函数 VerifyContentPayloadsContext​

func VerifyContentPayloadsContext(ctx context.Context, quoteTerms *FileQuoteTerms, contentHashes, payloads [][]byte, seed []byte) ([]byte, error)

VerifyContentPayloadsContext 验证交付批次:数量严格等于授权哈希数量、顺序 一一对应、逐项 SHA-256、seed/block 归属与协议期望长度。当批次内携带与报价 SeedHash 对应的 seed payload 时,先完整验证它,再用它做块成员校验;返回值 是实际用于成员校验的 seed 深复制,调用方可用它继续计算聚合价格。ctx 仅用 于可取消的大 payload 计算。

函数 VerifyContentRequestEvidence​

func VerifyContentRequestEvidence(request *SignedContentRequest, quote *SignedFileQuote, opening PoolOpeningEvidence) (*PaymentAuthorization, *FileQuoteTerms, error)

VerifyContentRequestEvidence 是时间无关的 003 完整证据验证:报价证据与 卖方签名、池绑定、买方统一签名、FileQuoteTermsID 比对以及 Buyer/Seller/Arbiter 与开池证据的绑定。它不检查报价过期或交付截止时间; 角色工作流用它保证整个操作只使用调用方显式传入的一份时间事实。

类型 FileQuoteTerms​

FileQuoteTerms 是卖方对单个买方的签名定价与到期承诺。它是 Kind 1 认证文档:只含业务字段,没有版本和 Kind。RecommendedFilename 是卖方提供的经 sanitize 的展示事实,因此与经济条款一起签名;不同的文件名因此产生不同的 file_quote_terms_id。

type FileQuoteTerms struct {
// SeedHash 是内容仓库的种子摘要(SHA-256,32 字节):买方据此识别要购买
// 的 seed;等于该值的哈希按 seed 计价,其余哈希必须能在该 seed 中找到。
SeedHash []byte
// BuyerPublicKey 是唯一被允许接受并签署后续 003 请求的买方压缩公钥
// (33 字节);报价只面向这一个买方。
BuyerPublicKey []byte
// SeedPriceSatoshis 是整个 MasterSeed 的绝对单价,单位 satoshi。
SeedPriceSatoshis uint64
// FullBlockPriceSatoshis 是一个完整块(256 KiB)的绝对单价,单位
// satoshi;尾块按实际长度比例计算并享受 10% 卖方让利。
FullBlockPriceSatoshis uint64
// FileSizeBytes 是文件总字节数;块数由它派生:0 -> 0 块,正数 ->
// ceil(file_size_bytes / 262144)。
FileSizeBytes uint64
// QuoteExpiresAtUnixSeconds 是报价失效时间(UTC Unix 秒,int64);
// 到期判断由调用方用自己读取的一次系统时间完成。
QuoteExpiresAtUnixSeconds int64
// SupportedArbiterPublicKeysCBOR 是仲裁公钥数组的独立确定性 CBOR 子文档;
// 可为空数组,但内部公钥不得为空或重复。开池时 Arbiter 公钥必须在其中。
SupportedArbiterPublicKeysCBOR []byte
// RecommendedFilename 是经 sanitize 的展示文件名建议:先 sanitize 再编码,
// 与经济条款一起进入卖方统一签名;不同文件名产生不同 file_quote_terms_id。
// 它只是展示事实,不是内容/价格/身份的真值。
RecommendedFilename string
}

函数 DecodeFileQuoteTerms​

func DecodeFileQuoteTerms(data []byte) (*FileQuoteTerms, error)

DecodeFileQuoteTerms 验证并解码规范的 FileQuoteTerms 字节。

函数 VerifyFileQuoteEvidence​

func VerifyFileQuoteEvidence(quote *SignedFileQuote) (*FileQuoteTerms, error)

VerifyFileQuoteEvidence 验证时间无关的报价证据:结构、CBOR、压缩公钥与 统一 SignWireDocument(1, 1, ...) 卖方签名。它不检查当前是否过期;过期判断 由调用方用返回 terms 的 QuoteExpiresAtUnixSeconds 与显式传入的时间事实完成。

函数 VerifySignedFileQuote​

func VerifySignedFileQuote(quote *SignedFileQuote, at time.Time) (*FileQuoteTerms, error)

VerifySignedFileQuote verifies structural validity, quote expiry at the caller-supplied time fact, and the seller signature. It never reads a clock: at 必须由调用方作为本操作唯一时间事实传入。

类型 PaymentAuthorization​

PaymentAuthorization 是规范 Kind 5 ContentRequest 中未签名的被签字节部分:即买方的最终付款授权。它不携带公钥或费率:这些值由 RefundTemplateTxID 对应的 OpeningProof 唯一确定,报价仅由 FileQuoteTermsID 选择。

type PaymentAuthorization struct {
// FileQuoteTermsID 选择本授权购买的报价(SHA-256(exact
// file_quote_terms_cbor),32 字节);全零哨兵不得上线。
FileQuoteTermsID protocol.FileQuoteTermsID
// RefundTemplateTxID 选择费用池并经其不可变的 OpeningProof 唯一确定
// 买/卖/仲裁三方角色与费率(32 字节,按交易 TxID 算法派生)。
RefundTemplateTxID []byte
// PaymentSequence 是本次授权的目标付款状态序号;接收方验证它恰好等于
// previous + 1,范围 1..4294967294。
PaymentSequence uint32
// SellerAmountAfterSatoshis 是批次付款后卖方的绝对累计金额(单位
// satoshi),绝不是本批增量。
SellerAmountAfterSatoshis uint64
// ContentHashesCBOR 是确定性 CBOR 子文档:1..64 个有序且不重复的
// 32 字节内容哈希,与 payload 批次顺序一一对应。
ContentHashesCBOR []byte
// DeliveryDeadlineUnixSeconds 是交付截止时间(UTC Unix 秒,int64);
// 必须为正数且不超过报价有效期。
DeliveryDeadlineUnixSeconds int64
}

函数 DecodePaymentAuthorization​

func DecodePaymentAuthorization(data []byte) (*PaymentAuthorization, error)

DecodePaymentAuthorization 只接受 canonical 六元 Kind 5 认证文档。历史版本、内嵌 Kind、单哈希请求、缺失或多余字段以及非规范编码都会返回结构化的 malformed_wire/non_canonical/invalid_evidence 错误。

函数 VerifySignedContentRequestForOpening​

func VerifySignedContentRequestForOpening(request *SignedContentRequest, opening PoolOpeningEvidence) (*PaymentAuthorization, error)

VerifySignedContentRequestForOpening 针对调用方提供的本地开池证据验证 Kind 5 的池绑定与买方签名。卖方构造 Kind 8 Claim 时可以使用它,但 OpeningProof 不是 Kind 8 wire 请求的一部分。它从提供的 opening 派生 RefundTemplateTxID 并要求精确匹配,然后通过 VerifyWireDocument(1, 5, ...) 针对 opening 的买方公钥验证买方签名。报价、内容与时间事实刻意不在本函数范围内。

类型 PoolOpeningEvidence​

PoolOpeningEvidence 是把 003 绑定到其费用池所需的最小开池证据视图,bitfs 无需反向依赖 pool 包。*pool.OpeningProof 通过导出辅助方法实现该接口。

type PoolOpeningEvidence interface {
OpeningBuyerPublicKey() []byte
OpeningSellerPublicKey() []byte
OpeningArbiterPublicKey() []byte
OpeningRefundTemplateTxID() []byte
}

类型 SignedContentDelivery​

SignedContentDelivery 是完整的 Kind 6 ContentDelivery wire 报文。卖方签名通过统一的 SignWireDocument(1, 6, ...) helper 精确覆盖 content_delivery_cbor;payload 经被引用付款授权提交的哈希间接绑定,并作为尾部 attachment 传输。

type SignedContentDelivery struct {
// ContentDeliveryCBOR 是确定性 CBOR 认证文档 [payment_authorization_id],
// 把交付钉死到一次授权;它也是应用路由 004 到本地原始 003 的索引来源。
ContentDeliveryCBOR []byte
// SellerContentDeliverySignature 是卖方对精确 content_delivery_cbor 的
// 统一普通消息签名(SignWireDocument(1, 6, ...))。它不覆盖 payload。
SellerContentDeliverySignature []byte
// ContentPayloadsCBOR 是确定性 CBOR 子文档,按顺序承载与 003 哈希一一对应
// 的 payload 数组;作为 attachment 不进入签名预映像。
ContentPayloadsCBOR []byte
}

函数 CloneSignedContentDelivery​

func CloneSignedContentDelivery(delivery *SignedContentDelivery) *SignedContentDelivery

CloneSignedContentDelivery 返回 004 凭证的深拷贝,包括独立的条款、公钥、载荷和签名字节切片。

函数 DecodeSignedContentDelivery​

func DecodeSignedContentDelivery(data []byte) (*SignedContentDelivery, error)

DecodeSignedContentDelivery 解码规范的 Kind 6 wire 报文字节。

函数 NewSignedContentDelivery​

func NewSignedContentDelivery(ctx context.Context, paymentAuthorizationID protocol.PaymentAuthorizationID, payloads [][]byte, signer protocol.Signer) (*SignedContentDelivery, error)

NewSignedContentDelivery 基于被引用的付款授权 ID 构造一元 content_delivery_cbor,通过统一 SignWireDocument(1, 6, ...) helper 签名,并附加规范编码的 payload 批次。调用方必须先完整验证被引用的 003、报价、开池证明和每一个 payload,再调用此构造器。

类型 SignedContentRequest​

SignedContentRequest 是完整的 Kind 5 ContentRequest wire 报文:规范的 payment_authorization_cbor 加上买方对 WireSignatureInput(1, 5, payment_authorization_cbor) 的签名。

type SignedContentRequest struct {
// PaymentAuthorizationCBOR 是 exact 规范付款授权字节(确定性 CBOR),
// 也是 payment_authorization_id = SHA-256(...) 的计算来源。
PaymentAuthorizationCBOR []byte
// BuyerPaymentAuthorizationSignature 是买方对 WireSignatureInput(1, 5,
// payment_authorization_cbor) 的 low-S DER 统一消息签名。
BuyerPaymentAuthorizationSignature []byte
}

函数 CloneSignedContentRequest​

func CloneSignedContentRequest(request *SignedContentRequest) *SignedContentRequest

CloneSignedContentRequest 返回 003 凭证的深拷贝,包括独立的条款、公钥和签名字节切片。

函数 DecodeSignedContentRequest​

func DecodeSignedContentRequest(data []byte) (*SignedContentRequest, error)

DecodeSignedContentRequest 解码规范的 Kind 5 wire 报文,并在返回副本前拒绝畸形数组外形、外层版本/kind 对和字节字段问题。

函数 NewSignedContentRequest​

func NewSignedContentRequest(ctx context.Context, authorization *PaymentAuthorization, signer protocol.Signer) (*SignedContentRequest, error)

NewSignedContentRequest 确定性编码付款授权,并经统一 SignWireDocument(1, 5, ...) helper 用受约束 Signer 签署这些 exact 字节。签名立即对 Signer 固定公钥自验;私钥绝不进入任何 wire 报文、本地结果、日志或持久化结构。

类型 SignedFileQuote​

SignedFileQuote 是完整的 Kind 1 FileQuote wire 报文载荷:规范报价条款、卖方身份公钥,以及卖方对 WireSignatureInput(1, 1, terms_cbor) 的签名。

type SignedFileQuote struct {
// FileQuoteTermsCBOR 是 exact 规范条款字节(确定性 CBOR),也是
// file_quote_terms_id = SHA-256(...) 的计算来源;验证后绝不重编码。
FileQuoteTermsCBOR []byte
// SellerPublicKey 是卖方压缩公钥(33 字节),用于恢复并验证条款统一签名。
SellerPublicKey []byte
// SellerFileQuoteTermsSignature 是卖方对 WireSignatureInput(1, 1,
// file_quote_terms_cbor) 的 low-S DER 统一消息签名。
SellerFileQuoteTermsSignature []byte
}

函数 CloneSignedFileQuote​

func CloneSignedFileQuote(quote *SignedFileQuote) *SignedFileQuote

CloneSignedFileQuote 返回用于 API 和存储边界的独立副本。

函数 DecodeSignedFileQuote​

func DecodeSignedFileQuote(data []byte) (*SignedFileQuote, error)

DecodeSignedFileQuote 解码一条 canonical Kind 1 wire 报文。签名与过期验证有意分离:调用方用自己显式的时间事实经固定证据路径完成验证。

函数 NewSignedFileQuote​

func NewSignedFileQuote(ctx context.Context, terms *FileQuoteTerms, signer protocol.Signer) (*SignedFileQuote, error)

NewSignedFileQuote 校验报价条款,编码 canonical FileQuoteTermsCBOR,经统一 SignWireDocument(1, 1, ...) helper 用受约束 Signer 签署这些 exact 字节,并用 Signer 公钥固定自验后才返回可携带的 Kind 1 凭证。推荐文件名以条款草稿为唯一来源:调用方先 sanitize;私钥绝不进入任何 wire 报文、本地结果、日志或持久化结构。

类型 UnixSeconds​

UnixSeconds 是协议使用的 UTC Unix 秒表示。

type UnixSeconds int64

类型 VerifiedQuote​

VerifiedQuote 是字段私有、访问器防御性复制的已验证报价:它证明卖方签名、 条款结构与其绑定关系全部正确(Verified),并携带买方做后续时间判断所需的 最终规范化 terms。它不拥有存储或网络行为;应用自行保存 exact Kind 1 bytes。

type VerifiedQuote struct {
// contains filtered or unexported fields
}

函数 VerifyQuoteForBuyer​

func VerifyQuoteForBuyer(quote *SignedFileQuote, facts protocol.Facts, buyerPublicKey []byte) (*VerifiedQuote, error)

VerifyQuoteForBuyer 是获得 VerifiedQuote 的唯一公开路径:执行时间无关证据 验证(结构与卖方统一签名)、显式时间过期判断与买方归属绑定,全部通过后才 返回不可变 verified value。伪造、他人报价或已过期报价都会被拒绝。 时间事实经 protocol.Facts.RequireNow 获取:零值时间直接拒绝,绝不回退 系统时钟,也绝不可能用零值绕过过期门禁。

函数 (*VerifiedQuote) AllowsArbiter​

func (v *VerifiedQuote) AllowsArbiter(publicKey []byte) bool

AllowsArbiter 报告指定仲裁公钥是否在报价允许列表内。

函数 (*VerifiedQuote) BuyerPublicKey​

func (v *VerifiedQuote) BuyerPublicKey() []byte

BuyerPublicKey 返回唯一被授权买方的压缩公钥副本。

函数 (*VerifiedQuote) EqualTermsID​

func (v *VerifiedQuote) EqualTermsID(other protocol.FileQuoteTermsID) bool

EqualTermsID 比较给定 ID 是否等于本报价的 typed ID。

函数 (*VerifiedQuote) ExpiresAt​

func (v *VerifiedQuote) ExpiresAt() time.Time

ExpiresAt 返回报价失效时间(UTC Unix 秒);过期判断由调用方用自己的显式 时间事实完成,SDK 不读钟。

函数 (*VerifiedQuote) ID​

func (v *VerifiedQuote) ID() protocol.FileQuoteTermsID

ID 返回 file_quote_terms_id = SHA-256(exact file_quote_terms_cbor)。

函数 (*VerifiedQuote) Quote​

func (v *VerifiedQuote) Quote() *SignedFileQuote

Quote 返回深拷贝的完整已签报价凭证(含 exact terms CBOR 与卖方签名)。

函数 (*VerifiedQuote) SeedHash​

func (v *VerifiedQuote) SeedHash() []byte

SeedHash 返回报价种子摘要的副本。

函数 (*VerifiedQuote) SellerPublicKey​

func (v *VerifiedQuote) SellerPublicKey() []byte

SellerPublicKey 返回卖方压缩公钥副本。

函数 (*VerifiedQuote) SupportedArbiterPublicKeys​

func (v *VerifiedQuote) SupportedArbiterPublicKeys() [][]byte

SupportedArbiterPublicKeys 解码并返回受支持仲裁公钥的深拷贝列表。

函数 (*VerifiedQuote) Terms​

func (v *VerifiedQuote) Terms() *FileQuoteTerms

Terms 返回深拷贝的已解码条款;RecommendedFilename 是实际签署的单一来源值。

由 gomarkdoc 生成