1 个不稳定版本

0.1.0 2023年5月29日

#16#publisher

MIT/Apache

95KB
1.5K SLoC

Droplinked 合约

您可以从这里下载 droplinked 小型合约测试环境 此处

源代码的 Rust 文档可以在这里找到 此处

合约接口文档可以在这里找到 此处

构建和部署

先决条件

您需要在您的系统中安装 CLI 客户端rust(1.60.0-nightly或更高版本)和 make

构建

ndpc_contract 文件夹中运行

make build-contract

以构建 WASM 文件,并将其部署到 casper 链上。

构建的结果将位于 ndpc_contract/deploy/contract.wasm 文件中。

如果您没有安装 make,可以直接运行此命令

cd contract && cargo build --release --target wasm32-unknown-unknown
wasm-strip contract/target/wasm32-unknown-unknown/release/contract.wasm 2>/dev/null | true
cp contract/target/wasm32-unknown-unknown/release/contract.wasm deploy/contract.wasm

文档

ndpc_contract 文件夹中运行

make doc

ndpc_contract 文件夹中运行,以生成合约的 rust 文档

部署

在部署部分,我们应该将此 WASM 文件发送到 casper 节点,以在链上部署它们,运行

casper-client put-deploy -n http://CSPR_RPC:7777 \
--chain-name CHAINNAME --payment-amount 231420060000 \
-k PATH_TO_SECRET_KEY --session-path deploy/contract.wasm \
--session-arg "ratio_verifier:string='PUBLICKEY_OF_RATIO_VERIFIER'" \
--session-arg "fee:u64='FEE'" \
--ttl "5hour"

其中

  • CSPR_RPC 是 casper rpc 节点的 IP 地址(对于测试网或主网),可以在 此处此处(测试网或主网节点)找到
  • CHAINNAME 应为测试网时为 casper-test,主网时为 casper
  • PATH_TO_SECRET_KEY,可以通过从 casper-signer 下载您的私钥来访问
  • FEE 应设置为当前的 UNIXEPOCH 时间,它用于合约的安全性
  • PUBLICKEY_OF_RATIO_VERIFIER,应设置为为 buy 入口点签署 CSPR/USDT 比率的当事人的公钥

单元和集成测试

要运行测试,请转到 ndpc_contract 文件夹,并在已安装 make 的 Linux 环境中运行

make test

您应该在您的终端中看到以下结果

running 16 tests
test tests::install_contract_with_error ... ok
test tests::install_contract_test ... ok
test tests::mint_entrypoint ... ok
test tests::approve_entry_point_with_error ... ok
test tests::cancel_request_entry_point_with_auth_error ... ok
test tests::approve_entry_point_with_auth_error ... ok
test tests::cancel_request_entry_point_with_error ... ok
test tests::approve_entry_point ... ok
test tests::cancel_request_entry_point ... ok
test tests::disapprove_entry_point_auth_error ... ok
test tests::disapprove_entry_point ... ok
test tests::disapprove_entry_point_error_amount ... ok
test tests::disapprove_entry_point_error_approved_id ... ok
test tests::mint_product_with_error ... ok
test tests::publish_request_with_error ... ok
test tests::publish_request_entry_point ... ok

test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.32s

您还可以更改tests/src目录中的代码,添加您的测试或编辑此测试。目前有一个测试方法,针对合约的每个入口点(除了需要更复杂测试的购买方法),如下所示:MintPublish_requestapprovecancel_requestdisapprove


简介

在droplinked协议中,我们在链上注册产品,以便第三方发布者可以利用这些注册产品在任何市场、dapp或原生网站上销售以赚取佣金。我们还通过droplinked.com上的无头工具和其它增值NFT解决方案来补充这一点。这个特定仓库包含针对Casper网络的定制合约。

droplinked.com需要与casper-signer交互以签署交易。与casper-signer的交互对于登录、铸造、购买、发布以及所有需要签名的操作都是必要的。

droplinked的合约实现了以太坊ERC-1155标准的基功能。此合约实现了SFT代币(半同质代币),它们既有唯一性又有价值。例如,生产者想要铸造1M个同款产品的NFT(每个产品都有一个nft,描述了物品的所有者);使用如ERC-721(CEP47)这样的标准铸造1M个NFT并不经济(存储1M个ID和所有者地址将花费大量gas);因此,我们不是逐个铸造,而是铸造一个基础代币(包含ID),并保留该ID以及特定账户拥有的代币数量。

这样,我们只为每个特定账户存储一个代币ID(代表产品)和一个数字(代表一个人拥有的这些代币ID的数量)。

在droplinked上,发布者可以向生产者发送一个包含特定预定佣金金额的发布请求。生产者可以接受或拒绝请求,如果请求被接受,发布者就获得了发布产品并与消费者分享以赚取其应得结算部分的权限。

存在一个Python工具文件,它与合约交互(用于测试目的)。它使用3个账户(它们的密钥位于密钥目录)。


合约结构

以下是解释合约中使用的每个结构和它们如何使用的方法。

  1. NFTHolder:这个结构存储了特定账户的代币ID及其数量。remaining_amount是未发布给发布者的剩余数量。
  2. NFTMetadata:这个结构存储了代币的元数据。它有名称、URI(可以是IPFS哈希)、校验和(链下上传的文件哈希)以及价格(美元)。我们将在未来的购买方法中添加购买代币的功能,以利用CSPR代币以固定的美元价格购买。
  3. PublishRequest:这个结构存储了发布者向生产者发布代币的请求。它有一个holder_id、数量、发布者地址、生产者地址和offer_id。这个结构将被保存在一个将request_id映射到PublishRequest的字典中。
  4. ApprovedNFT : 这个结构体存储了已批准代币的数据(用于出版商),包括持有者ID、数量、所有者和出版商账户地址、代币ID以及佣金金额。生产者批准PublishRequest后,它将被保存在一个字典中,将每个批准ID映射到该对象。
  5. PublishOffer : 这个结构体存储了生产者声明的NFT的代币细节和佣金,offer_id将被映射到offers字典中的这个结构体。

方法(入口点)

在这里,我们解释了合同中的每个方法及其用法。

  1. Mint : 获取(metadatapriceamountreciver_key)并铸造amount数量的代币到reciver_key的账户。它首先将元数据存储在NFTMetadata结构体中,并保存在metadas字典中(将代币ID映射到其NFTMetadata)。如果metadata已铸造,它将使用其现有的token_id。然后它将创建一个NFTHolder结构体,并将其保存在holders字典中(将持有者ID映射到一系列NFTHolder结构体)。如果reciver_key已拥有该代币,它将向其NFTHolder结构体中添加amount,否则它将创建一个新的NFTHolder结构体并将其添加到列表中。
  2. publish_request : 获取(offer_id)并创建一个PublishRequest结构体,并将其保存在publish_requests字典中(将请求ID映射到PublishRequest结构体)。然后将请求ID放入producer_requests字典中(将生产者账户哈希映射到请求ID列表),也将请求ID放入publisher_requests字典中(将出版商账户哈希映射到请求ID列表)。生产者可以接受或拒绝请求,出版商可以取消任何请求。
  3. approve : 获取(request_id)并批准它,创建一个ApprovedNFT结构体,并将其保存在approved_nfts字典中(将批准ID映射到ApprovedNFT结构体)。然后将批准ID放入producer_approved字典中(将生产者账户哈希映射到批准ID列表),也将批准ID放入publisher_approved字典中(将出版商账户哈希映射到批准ID列表)。生产者可以在任何时间之后的时间戳取消批准请求。
  4. disapprove : 接收 (approved_id, amount, publisher_address) 并撤销 approved_id。如果 amount 等于 ApprovedNFT 结构体的 amount,它将从 producer_approvedpublisher_approved 字典中移除 approved_id。否则,它将减少 ApprovedNFT 结构体的 amount
  5. buy : 接收 (approved_idamount) 以及一个 purse(会话代码将传递给合约)以及如果 purse 中的 CSPR 代币根据要求足够,它将转让佣金金额给出版者,并将剩余金额减去任何版税后转给生产者。然后它将减少 ApprovedNFT 结构体的 amount。如果 amount 等于 ApprovedNFT 结构体的 amount,它将移除 approved_id 并激活 producer_approvedpublisher_approved 字典。然后它为买家创建一个 NFTHolder 结构体并将其保存到 holders 字典中。[待办事项]:如果买家已经拥有此代币,它将把 amount 添加到其 NFTHolder 结构体中,否则它将创建一个新的 NFTHolder 结构体并将其添加到列表中。
  6. cancel_request : 接收 (request_id) 并从 producer_requestspublisher_requests 字典中移除 request_id
  7. publish_offer : 从生产者端创建一个新报价,并将其放入报价字典中,该字典将报价_id 映射到报价。
  8. init : 初始化合约所需的字典。它在安装者部署合约时调用一次,并且任何其他用户(或安装者)在合约安装后都无法调用。
  9. 获取函数 : 这些函数用于从一个合约与另一个合约交互或通过会话调用与合约交互。

  • 构造函数:此组用于初始化合约。
  • [待办事项] 生产者:生产者可以铸造代币并批准请求。
  • [待办事项] 出版者:出版者可以发布已批准的请求和发送发布请求。

存储模型

storageModel

部署

此合约已在 Testnet(casper-test)上成功部署,以下是合约哈希:[链接](https://testnet.cspr.live/contract/8259fd8ae5d5a4ecf9f93f2570336ec621fdf9e36fd252b8459c3315351952ad)

项目功能

NFT 限制系统

生产者可以设置一组规则以出售其代币。他们可以限制买家为购买过生产者其他几个代币的账户(限制),或者提供分层折扣。

这些规则(规则集)在客户购买代币之前部署在 droplinked.com。

NFT 店铺

droplinked.com 提供了一个店面,生产者可以在其中上传他们的 NFT 并设置价格和规则,而客户可以探索 NFT 并购买。这些 NFT 代表了数字和实体商品。

依赖关系

~7.5MB
~165K SLoC