如何在 KADENA 上部署智能合约

mas*_*1na 4 pact-lang

请问如何在没有 Chainweaver Web UI 的情况下将智能合约部署到测试网或主网?我知道我需要一个 YAML 文件,但我该如何处理它以及将它发送到哪里?

我需要运行 pact 服务器、chainweb api 还是......?我找不到任何指南

geo*_*gep 6

第 0 步:安装先决条件

安装契约

第 1 步:创建 Pact 模块

我们将部署以下契约模块。为了简单起见,我们正在部署的契约代码不使用事务的数据字段(read-keyset 就是使用该字段的契约函数之一)。否则,必须更改随附的 YAML 文件。我们还假设此契约代码保存为 test.pact。

(namespace 'free)

(module someModuleName AUTONOMOUS

  (defcap AUTONOMOUS ()
    true)

  (defun dummy ()
    (+ 1 2)
  )
)
Run Code Online (Sandbox Code Playgroud)

步骤 2:创建 YAML 文件

以下 YAML 文件将与 pact -a 一起使用来签名并生成向测试网提交交易所需的转义 JSON。

codeFile: /Users/linda.ortega.cordoves/pact/test.pact
networkId: testnet04
publicMeta:
  chainId: "0"
  gasLimit: 1000
  ttl: 28000
  creationTime: 1585056536
  sender: "testing"
  gasPrice: 0.00001

keyPairs:
  - public: 1d877a7b4524b6724a6ae708cf9ea7396d6ee9d17b10098b7793800177669c1d
    secret: 33fcd94b8a42057bd4e3190f8983e3a73ec96c3f60df95c9e2aa3f13602c714f
nonce: step02
Run Code Online (Sandbox Code Playgroud)

该文件做出了一些假设,这些假设可能会根据您的具体实现而改变:

我们要上传的协议的完整路径是:/Users/linda.ortega.cordoves/pact/test.pact

我们要向 Testnet 提交一笔交易,其网络 id 为 testnet04

我们要提交到测试网上的第零条链,该链的链 ID 为“0”

UNIX Epoch 时间中的当前创建时间是 1585056536 秒。该值必须更改,因此可以通过导航到此网站或在命令行上运行 date +%s 来计算它。

该“测试”是测试网网络上支付 Gas 费用的帐户(也称为“发送者”)。要创建测试网帐户并为其注入一些代币,请导航至测试网代币水龙头。您需要生成 ED22519 公钥-私钥对才能使用水龙头。您可以使用pact -g 来生成此密钥对。确保将其保存在某个地方。

“keyPairs”中指定的密钥对对应于用于创建 Gas 支付者帐户的密钥对,在本例中为“testing”。这必须更改提供的默认值。

我们将此 YAML 文件保存为 /Users/linda.ortega.cordoves/pact/test.yaml。

第 3 步:将交易提交到测试网

现在,我们将通过点击测试网节点的 /send 端点来提交我们创建的示例契约模块。在命令行中,运行以下命令:

pact -a /Users/linda.ortega.cordoves/pact/test.yaml | curl -H "Content-Type: application/json" -d @- https://us1.testnet.chainweb.com/chainweb/0.0/testnet04/chain/0/pact/api/v1/send
Run Code Online (Sandbox Code Playgroud)

我们在创建 YAML 文件时所做的一些假设在这里变得很重要:

网络 ID 必须与我们提交的节点端点匹配。由于我们选择的网络id是testnet04,所以我们必须提交到/chainweb/0.0/testnet04/。我们提交到的节点(在本例中为 us1.testnet.chainweb.com)必须具有此网络 id。链 ID 也必须匹配。我们选择的链ID为“0”,因此我们必须提交到/chain/0/。我们将 yaml 文件保存到 /Users/linda.ortega.cordoves/pact/test.yaml。如果我们成功提交交易,我们将看到以下内容:

{"requestKeys":["Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek"]}
Run Code Online (Sandbox Code Playgroud)

这意味着我们的交易已成功添加到区块链的内存池中并等待被挖掘。记下从 /send 返回的请求密钥,因为我们将在轮询事务结果时使用它。

当我们尝试提交交易时,我们的交易也有可能无法通过节点验证。如果发生这种情况,您将收到验证失败消息而不是请求密钥。

第四步:验证交易结果

现在,我们将尝试通过点击 /poll 端点来获取提交到 Testnet 网络的交易结果。在命令行中,运行以下命令:

curl -H "Content-Type: application/json" -d '{"requestKeys":["Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek"]}' -X POST https://us1.testnet.chainweb.com/chainweb/0.0/testnet04/chain/0/pact/api/v1/poll
Run Code Online (Sandbox Code Playgroud)

同样,我们在此步骤中做出一些假设:

我们要轮询的测试网节点是 us1.testnet.chainweb.com。网络 ID 为 testnet04。请注意,端点的一部分是/chainweb/0.0/testnet04/。我们轮询的链 ID 是链“0”。请注意,端点的一部分是/chain/0/。我们轮询的请求密钥是 Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek。如果交易被成功挖掘并添加到区块链中,那么 /poll 将返回以下 JSON 对象:

pact -a /Users/linda.ortega.cordoves/pact/test.yaml | curl -H "Content-Type: application/json" -d @- https://us1.testnet.chainweb.com/chainweb/0.0/testnet04/chain/0/pact/api/v1/send
Run Code Online (Sandbox Code Playgroud)

请注意,交易可能会在协议级别失败,但仍会添加到区块链中并收取 Gas 费用。如果发生这种情况,result.status 字段将失败。

如果交易尚未被挖掘,/poll 将返回 {}。继续重试,直到收到上面显示的 JSON 对象。