http://www.7klian.com

CKB 剧本编程简介之编程语言选择

· 操作 SMT solver 来验证代码执行
  while true {
· 由那些不是专注于底层的工程师举办构建;
15 |     int ret = load_data(index, buffer);␊
5 |    where len(buffer) >= 6 {␊
  | ^

在构建 CKB 时,我们选择利用了一个通用的 VM,所以它不会绑定任何特定的编程语言。这种模式虽然有其利益,但它也会带来一些问题。我们常常被问及的一个问题是:在 Nervos CKB 上,我应该用什么语言来举办编程?让我们试着答复这个问题。
当最终生成代码,我们稍微整理一下,看起来就像是我们用 C 写的那样:
2. 有许多语言可以编译成 C 语言,我们稍后会展示一个真实的例子;
  |                      ^^
· 需要快速变革或动态行为;
   |
  int ret = as<int>ckb::ckb_load_cell_data(buffer, &l, 0, index, 2);
using <string.h>::{memcmp};
5 |    where len(buffer) >= 6 {␊
· Nervos Talk:
 
 
假如你看过我们的代码,你会发明我们从团队哪里得到了 secp256k1 的 C 库(很是感激他们!)。很明明,C 在这里是一个选项。可是 C 并不是独一的选项:正如我们在上面提到的,我们正在不绝推进这个偏向,我们但愿 Rust 可以在这里作为第二个选项。此刻已经有许多用 Rust 构建的暗码学库了,我们但愿拥抱整个区块链社区,而不是远离它。但除了 C 和 Rust 之外,背后尚有更多有趣的故事:
1. 你的目标是什么?你是仅仅想在 CKB 长举办试验,照旧已经想好了方针是要构建一个出产级的 dApp?
  return ret;
  |
 
  |              ^—–^
 
首先,我相信每一位 dApp 开拓者都应该有选择开拓语言的自由。没有哪个开拓者会比 dApp 开拓者更相识详细的细节。没有一种编程语言可以或许为各类百般大概呈现的 dApp 提供全套办理方案,我们提供差异的编程语言,你完全可以按照本身的需要举办选择。
在 CKB 长举办尝试时,你可以更自由地利用差异的语言,我将按照上面提及的第二个问题「你但愿在 CKB 上构建的对象」来分别我的发起。
4 | fn load_data(u64 index, u8 mut * buffer) -> int␊
  int const ret = (int)(ckb_load_cell_data(buffer, (&l), 0, index, 2));
 
 
#include <string.h>
  return 0;
 
9 | }␊
通例的 dApp 建树者
$ zz build
 
但同时,,这也是一个不认真任的答复!汇报一个新人你有许多选择,就像是什么都不汇报他们一样,他们只会被浩瀚选择沉没。究竟,他们只是想选择一门语言然后开始实验/制作。这意味在我们提供选择时,我们也需要提供发起:假如我们只是想在 CKB 上开始构建一个新的 dapp,我们应该选择哪一门语言?
你可以看到,ZetZ 知道我们将一个 3 字节的缓冲区通报给一个至少需要 6 字节缓冲区的函数。编译阶段会报错。
这是我们先前的 carrot 的例子在 ZetZ 中的样子:
    u8 buffer[6];
 –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:5:14
你的谜底,将影响我们在这里给出的发起。
 
1. 有许多语言都有纯 C VM 的实现,好比 Lua,MicroPython;
  = for infix expression |0| = false
你不需要领略这里的任何对象。但假如你相识一些 C,那么  where len(buffer) >= 6  会当即引起你的留意:ZetZ 利用定理证明器来确保所有对  load_data  函数的挪用都应该提供至少 6 个字节长的缓冲区。假如我们将主函数中的缓冲区巨细变动为小于 6,那么在我们编译代码时,会当即报错:
我但愿你此刻没有把我看成一位 ZetZ 的狂热分子。这只是一个我正在玩的例子。我真正想在这里说的是,假如你有任何你喜欢的特定的语言,可能发明白任何大概对你的 dApp 有用的对象,没有什么可以阻止你将其移植到 CKB 上。我们真的真的想把自由交还给所有无比优秀的开拓者们。假如你已经建设了一些被证明是有用的对象,我们的 Grants 打算和 CK Labs 打算正等着你。

 
using <ckb_syscalls.h> as ckb
固然就我小我私家而言,在我所知道的 CKB VM 可以被操作的方面,Rust 尚有很长一段路要走,虽然现实是,在区块链的世界中,Rust 很是受接待,(在很多环境下)也是一个很是不错的选择。我们但愿在不久的未来,大概是在几个月内,我们可以真诚地推荐各人利用 Rust 在 CKB 上构建出产级的智能合约。
   |                         ^————^
}
这个例子只演示了 ZetZ 的一个小小的利益,而 ZetZ 中的定理证明器必定可以举办更巨大的查抄。这门语言仍处于低级阶段,我不知道它在将来会成长成什么样子,但这绝对是我会一连存眷的工作。
      break;
V: Vector Extension(向量扩展)
    }
 
#include <stdbool.h>
   |                         ^————^
  –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:15:25
与此同时,我们正致力于 Rust 的支持事情,但愿可以将 Rust 列入候选名单。但在本日,Rust 的事情照旧较量粗拙的,在将来 Rust 大概是一个很是不错的在 CKB 上构建产物级智能合约的选择。可以必定的是,我们将继承维护和支持在 CKB 上利用 Rust 来构建智能合约。
  |                         ^
   |
 –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:5:22
  |
这些天我着迷于 ZetZ。它提供了一个奇特的成果集,很是适合 CKB VM:
在最后的 C 代码中,没有包括验证器查抄代码。这只是一个普通的 C 实现的样子。这里我们没有付出任何运行时的本钱。
 
      return -1;
 
                                      uint8_t* const buffer);
这根基上提供了一个可以当纵然用的语言,而且很是适合区块链智能合约:在较低的层级上,有一个 C 编译器可以辅佐你生成既小又高效的代码;在较高的条理上,一个定理证明器可以辅佐你查抄代码逻辑,以确保代码是有意义的。另外,这并不是某种纯粹娱乐的项目,它在涉及大量加密代码的物联网系统中被实际利用,就像我们可以在区块链中利用它一样。
  |
                                      uint8_t* const buffer) {
fn load_data(u64 index, u8 mut * buffer) -> int
}
  | …
  –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:15:25
  |                      ^^
我们相信这两个扩展可以使我们(编者注:CKB VM)更靠近现代 CPU 架构的全部潜力。一旦将它们被引入到 CKB 中,基于暗码学算法的手写汇编将通过它们可以获得更大的速度晋升,这些是很难通过 C 或 Rust 之类的语言来实现的。
  }
对付这类人来说,JavaScript 大概是一个很是不错的编写智能合约的选择。我们此刻正在评估是否可以对 duktape 或其他适合 CKB 的 JavaScript 引擎举办一轮安详审计。固然你仍然需要审计你本身编写的 JavaScript 合约,但我们可以辅佐你确保你正在利用的底层的 JavaScript 引擎,将正确和安详地执行呼吁。
  |
  uint64_t const index = 0;
 –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:5:25
  u64 mut l = 6;
#include <stdint.h>
   |
ZetZ
      return -1;
    uint8_t const buffer[6];
static int ckb_zz_demo_main_load_data(uint64_t const index,
  = for literal 6 |0| = 0x6
    }
B: Bit Manipulation Extension(位操纵扩展)
static int ckb_zz_demo_main_load_data(uint64_t const index,
 
5 |    where len(buffer) >= 6 {␊
    }
                                      uint8_t* const buffer);
https://talk.nervos.org/
int __attribute__((visibility(“default”))) ckb_zz_demo_main_main();
 –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:4:1
  |
2. 你规划构建什么?你是想构建一个常见的 dApp,照旧想在 CKB 上建设一个新的暗码学原语?
对付认真构建出产级 dApp 的人员,首先需要提供一个警示:无论您选择何种语言来构建 dApp 的智能合约部门,您都需要对您的智能合约举办安详审计。裂痕只能通过严格的评估来消除,在这方面没有任何编程语言可以辅佐您。说完了警示,此刻我们进入推荐部门。
总结
 –> /home/ubuntu/code/ckb-zz-demo/src/main.zz:5:22
      break;
    if ((memcmp(buffer, “carrot”, 6) == 0)) {
CKB 的一个奇特之处在于,它将助力暗码学创新的发达成长。差异于以往,当时你只有通逾期待硬分叉,这样别人才可以将你缔造的全新的暗码学算法插手到区块链中。有了 CKB,你可以构建任何暗码学算法,并当即在链上实现它。你大概会问:这听上去很是不错,但我们在这里应该利用什么编程语言呢?
#include <stddef.h>
· 可以编译成 C,所以我们可以利用 GCC 将它编译成 RISC-V 的二进制文件;
所以假如你是开辟者范例的人,很是接待你可以移植新的语言到 CKB 上并使得它们可以或许在 CKB 上运行。并且它们将不会止步于尝试性语言,一旦人们常常利用它们,它们变得越来越成熟,我们完全可以将它们列为在 CKB 上的出产级的语言。这完全取决于我们对这门语言是否有足够的相识,知道哪些处所大概会呈现问题。我们成天都在实验新的语言,这里我可以向你展示我最新的实验:
留意:这里提出的发起,只是我本日写下本文时当下的想法,我们正在举办这个方面的事情,工作大概会随时改变。我会试着确保这篇文章保持更新状态,可是在你开始之前,最好先和我们确认一下,看看我们最新的发起是什么,您可以通过 Discord 可能 Nervos Talk 接洽到我们。
  while (true) {
不幸的是,此刻在 CKB 上的所有出产级的智能合约,都是用纯 C 写的。这样做的原因,并不是说 C 是写智能合约最符合的语言,但说真的,在我们开始构建 CKB 时,只有 C 能提供足够高的质量来构建我们需要的合约。当你有更好的选择时,我们不发起利用 C 来构建任何智能合约,但我们不得不认可,有时候 C 是最后的选择。
export fn main () -> int {
在提出发起前,我们首先需要答复两个简朴的问题:
  = function call requires these conditions
 
用于出产级的语言
int main() {
· 勉励在没有动态内存分派的环境下利用仓库
对付测试通例的 dApp 逻辑,你将有更多的选择:我们在上面提到过的 JavaScript,我们也支持 Ruby。Rust 也将成为一个可行的选项。尚有一种语言我出格想提一下:由于一些奇怪的未知原因,AssemblyScript 在区块链行业中获得了遍及的应用。思量到我们此刻已经有了对 WASM 集成的支持,你也可以利用 AssemblyScript 在 CKB 上构建智能合约。我们但愿确保你已有的在其他区块链项目上构建的智能合约的常识不会挥霍。创新至关重要,但掩护汗青也同样重要。
CKB 的优势并不只限于此,尚有比这更令人欢快的:
    }
https://discord.com/invite/AqGTUE9
5 |    where len(buffer) >= 6 {␊
    int const ret = ckb_zz_demo_main_load_data(index, buffer);
15 |     int ret = load_data(index, buffer);␊
 
   = in this callsite
  = for this function
  |
· Discord:
  return ret;
  |
  |
    if memcmp(buffer, “carrot”, 6) == 0 {
    index++;
  |
 
  uint64_t l = 6;
  return 0;
    if ret == 1 {
暗码学原语的探险家
4. 我们此刻也支持了 WASM,也有许多 WebAssembly 专门的语言,好比 AssemblyScript;
   = last callsite
static int ckb_zz_demo_main_load_data(uint64_t const index,
  }
    (index++);
  = for literal 3 |0| = 0x3
    if ((ret == 1)) {
尝试性的语言
假如你挖掘的够深,大大都常常被利用的暗码学库都利用手写的汇编措施来进一步加快代码。这背后虽然是有原因的。既然 CKB 是成立在一个 CPU 利用的真实指令集上,我们为什么不直接利用手写的 RISC-V 汇编来进一步加快暗码学算法呢?为了证明可行性,我们正在密切存眷两个最新的 RISC-V 指令集扩展:
    int ret = load_data(index, buffer);
 
 
  u64 index = 0;
奔腾地平线
· 大概不会那么容易受到 cycle 耗损的影响;
 [ERROR] unproven callsite assert for infix expression
  |
3. LLVM 现已正式支持 RISC-V,有许多将 LLVM 作为方针的语言,好比 zig;
 
}
}
固然必定不能合用于所有环境,但多半数人构建智能合约时大概是这样的:
#include <ckb_syscalls.h>
   |
   where len(buffer) >= 6 {

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。