首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在KADENA上部署智能契约

如何在KADENA上部署智能契约
EN

Stack Overflow用户
提问于 2022-05-18 19:41:51
回答 1查看 383关注 0票数 3

请说明如何在没有Chainweaver web UI的情况下将智能契约部署到testnet或mainnet?我知道我需要一个YAML文件,但我该如何处理它,我到底要把它发送到哪里呢?

我需要运行pact服务器,chainweb api还是.?我找不到任何向导

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-19 07:55:34

步骤0:安装先决条件

安装协约

步骤1:创建契约模块

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

代码语言:javascript
复制
(namespace 'free)

(module someModuleName AUTONOMOUS

  (defcap AUTONOMOUS ()
    true)

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

步骤2:创建YAML文件

下面的YAML文件将与pact -a一起使用,以签署并生成向Testnet提交事务所需的转义JSON。

代码语言:javascript
复制
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

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

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

我们希望向Testnet提交一个事务,它的网络id是testnet04。

我们希望提交到Testnet上的第零链,它的链id为"0“。

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

该“测试”是在Testnet网络上支付gas (也称为“发件人”)的帐户。要创建一个Testnet帐户并为其提供一些硬币,请导航到Testnet硬币水龙头。您需要生成一个ED22519公钥对才能使用水龙头。您可以使用pact -g生成此密钥对。一定要把它保存在某个地方。

在"keyPairs“中指定的密钥对对应于用于创建气体支付者帐户的密钥对,在本例中这是”测试“。这必须改变所提供的默认值。

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

步骤3:将事务提交到Testnet

现在,我们将提交通过命中Testnet节点的/send端点而创建的示例pact模块。在命令行中,运行以下命令:

代码语言:javascript
复制
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 04/。我们提交给的节点(在本例中是us1.testnet.chainweb.com)必须具有这个网络id。链id也必须匹配。我们选择了"0“的chain id,所以我们必须提交给/chain/0/。我们将yaml文件保存到/Users/linda.ortega.cordoves/pact/test.yaml。如果我们成功地提交了事务,我们将看到以下内容:

代码语言:javascript
复制
{"requestKeys":["Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek"]}

这意味着我们的事务已经成功地添加到块链的内存池中,并且正在等待挖掘。请注意从/send返回的请求键,因为我们将在轮询事务结果时使用它。

当我们尝试提交事务时,我们的事务也可能失败节点验证。如果发生这种情况,您将收到验证失败消息,而不是请求键。

步骤4:验证事务的结果

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

代码语言:javascript
复制
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

同样,我们在这一步中做了几个假设:

我们想要投票的Testnet节点是us1.testnet.chainweb.com。网络id是testnet04。注意,端点的一部分是/chainweb/0.0/testnet04 04/。我们正在轮询的链码是"0“链。注意,端点的一部分是/chain/0/。我们要轮询的请求键是Vetli41gi_S4-dZlro0visI8QT15brHoPe4vxMmhdek。如果成功挖掘了事务并将其添加到块链中,则/poll将返回以下JSON对象:

代码语言:javascript
复制
{
  "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将返回{}。继续重试,直到收到上面所示的JSON对象。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72295102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档