如何在 KADENA 上部署智能合约

How to deploy a smart contract on KADENA

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

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

第 0 步:安装先决条件

安装Pact

第 1 步:创建契约模块

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

(namespace 'free)

(module someModuleName AUTONOMOUS

  (defcap AUTONOMOUS ()
    true)

  (defun dummy ()
    (+ 1 2)
  )
)

第 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

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

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

我们要提交一笔交易到Testnet,网络id是testnet04

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

UNIX 纪元时间中的当前创建时间为 1585056536 秒。这个值必须改变,所以通过导航到这个网站或在命令行上 运行ning date +%s 来计算它。

“测试”是在 Testnet 网络上支付 gas 的帐户(又名“发送方”)。要创建一个 Testnet 帐户并为其提供一些硬币,请导航至 Testnet Coin Faucet。您需要生成 ED22519 public-private 密钥对才能使用水龙头。您可以使用 pact -g 生成此密钥对。确保将其保存在某个地方。

“keyPairs”中指定的密钥对对应于用于创建燃气付款人帐户的密钥对,在本例中为“测试”。这必须更改提供的默认值。

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

第 3 步:向测试网提交交易

我们现在将提交我们通过点击 Testnet 节点的 /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

我们在创建 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"]}

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

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

第 4 步:验证交易结果

我们现在将尝试通过访问 /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

同样,我们在此步骤中做出几个假设:

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

{
  "Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek": {
    "gas": 58,
    "result": {
      "status": "success",
      "data": "Loaded module free.linda-test, hash n0g99JhWnO2F7X7f8o_zcAiSHBAWS_QSAfn4yUaqpps"
    },
    "reqKey": "Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek",
    "logs": "0KzZQDJmEgnAKvPnO20UeGoE7KGCIN22nhjraeyp1aw",
    "metaData": {
      "blockTime": 1585056990071469,
      "prevBlockHash": "dIYmpjBQge9yw0Yzhn0Sau-wJFwsLOFBmGbV3_0xYeE",
      "blockHash": "yULpC5C-7tzRcc9sWm-f1bOC3JDvtxwT61hruW0aXrA",
      "blockHeight": 261712
    },
    "continuation": null,
    "txId": 266084
  }
}

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

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