26 个版本
0.1.44 | 2024 年 7 月 25 日 |
---|---|
0.1.41 | 2024 年 3 月 28 日 |
0.1.40 | 2023 年 12 月 1 日 |
0.1.39 | 2023 年 11 月 15 日 |
0.1.21 | 2022 年 7 月 28 日 |
4 在 #chia
352 每月下载量
在 4 个包中使用 (通过 rue-clvm)
1.5MB
39K SLoC
clvm_tools_rs
现代编译器的工作原理:./HOW_CHIALISP_IS_COMPILED.md
可以通过 cargo 安装此仓库
cargo install clvm_tools_rs
或者通过 pip
pip install clvm_tools_rs@git+https://github.com/Chia-Network/clvm_tools_rs.git@e17412032aa7d3b8b1d1f931893fb5802eee626a
注意: pip
安装的工具是 cargo
安装工具的一个子集,包括 brun
、run
、opc
和 opd
。
当前语言的最新版本在 nightly 分支中
[nightly](https://github.com/Chia-Network/clvm_tools_rs/tree/nightly)
从特定分支安装
cargo install --no-default-features --git 'https://github.com/Chia-Network/clvm_tools_rs' --branch nightly
将 git 检出安装到您的当前 Python 环境中(必须在某些类型的 venv 或 conda 环境中)
git clone https://github.com/Chia-Network/clvm_tools_rs
cd clvm_tools_rs
maturin develop
从 PYPI 安装
pip install -i https://pypi.chia.net/nightlies/ clvm_tools_rs
大多数人仍然通过 Python 编译 chialisp。设置编译的这种方式之一如下
import json
from clvm_tools_rs import compile_clvm
def compile_module_with_symbols(include_paths,source):
path_obj = Path(source)
file_path = path_obj.parent
file_stem = path_obj.stem
target_file = file_path / (file_stem + ".clvm.hex")
sym_file = file_path / (file_stem + ".sym")
compile_result = compile_clvm(source, str(target_file.absolute()), include_paths, True)
symbols = compile_result['symbols']
if len(symbols) != 0:
with open(str(sym_file.absolute()),'w') as symfile:
symfile.write(json.dumps(symbols))
提供的命令行工具
- run -- Compiles CLVM code from chialisp
Most commonly, you'll compile chialisp like this:
./target/debug/run -O -i include_dir chialisp.clsp
'run' outputs the code resulting from compiling the program, or an error.
- repl -- Accepts chialisp forms and expressions and produces results
interactively.
Run like:
./target/debug/repl
Example session:
>>> (defmacro assert items
(if (r items)
(list if (f items) (c assert (r items)) (q . (x)))
(f items)
)
)
(q)
>>> (assert 1 1 "hello")
(q . hello)
>>> (assert 1 0 "bye")
failed: CompileErr(Srcloc { file: "*macros*", line: 2, col: 26, until: Some(Until { line: 2, col: 82 }) }, "clvm raise in (8) (())")
>>>
- cldb -- Stepwise run chialisp programs with program readable yaml output.
./target/debug/cldb '(mod (X) (x X))' '(4)'
---
- Arguments: (() (4))
Operator: "4"
Operator-Location: "*command*(1):11"
Result-Location: "*command*(1):11"
Row: "0"
Value: (() 4)
- Env: "4"
Env-Args: ()
Operator: "2"
Operator-Location: "*command*(1):11"
Result-Location: "*command*(1):13"
Row: "1"
Value: "4"
- Arguments: (4)
Failure: clvm raise in (8 5) (() 4)
Failure-Location: "*command*(1):11"
Operator: "8"
Operator-Location: "*command*(1):13"
- brun -- Runs a "binary" program. Instead of serving as a chialisp
compiler, instead runs clvm programs.
As 'brun' from the python code:
$ ./target/debug/run '(mod (X) (defun fact (N X) (if (> 2 X) N (fact (* X N) (- X 1)))) (fact 1 X))'
(a (q 2 2 (c 2 (c (q . 1) (c 5 ())))) (c (q 2 (i (> (q . 2) 11) (q . 5) (q 2 2 (c 2 (c (* 11 5) (c (- 11 (q . 1)) ()))))) 1) 1))
$ ./target/debug/brun '(a (q 2 2 (c 2 (c (q . 1) (c 5 ())))) (c (q 2 (i (> (q . 2) 11) (q . 5) (q 2 2 (c 2 (c (* 11 5) (c (- 11 (q . 1)) ()))))) 1) 1))' '(5)'
120
- opc -- crush clvm s-expression form to hex.
As 'opc' from the python code.
opc '(a (q 2 2 (c 2 (c (q . 1) (c 5 ())))) (c (q 2 (i (> (q . 2) 11) (q . 5) (q 2 2 (c 2 (c (* 11 5) (c (- 11 (q . 1)) ()))))) 1) 1))'
ff02ffff01ff02ff02ffff04ff02ffff04ffff0101ffff04ff05ff8080808080ffff04ffff01ff02ffff03ffff15ffff0102ff0b80ffff0105ffff01ff02ff02ffff04ff02ffff04ffff12ff0bff0580ffff04ffff11ff0bffff010180ff808080808080ff0180ff018080
- opd -- disassemble hex to s-expression form.
As 'opd' from the python code.
opd 'ff02ffff01ff02ff02ffff04ff02ffff04ffff0101ffff04ff05ff8080808080ffff04ffff01ff02ffff03ffff15ffff0102ff0b80ffff0105ffff01ff02ff02ffff04ff02ffff04ffff12ff0bff0580ffff04ffff11ff0bffff010180ff808080808080ff0180ff018080'
(a (q 2 2 (c 2 (c (q . 1) (c 5 ())))) (c (q 2 (i (> (q . 2) 11) (q . 5) (q 2 2 (c 2 (c (* 11 5) (c (- 11 (q . 1)) ()))))) 1) 1))
历史
这是 chia 的 clvm 工具 通过 ChiaMineJP 将其转换为 typescript 的工作进行第二次移植。如果没有先前将各种半动态类型映射出来的工作,这将要困难得多(感谢 ChiaMineJP)。
这样做的一些原因包括
-
Chia 将 clvm 实现切换到 rust: clvm_rs,并且这段代码在同一语言中可能会加快速度并更好地跟踪 clvm。
-
我使用 ocaml 编写了一个新的编译器,具有更简单、更简单的结构,未来应该更容易改进和验证:ochialisp。
-
此外,即使在这种未优化的形式中,它也更快。
到目前为止,我带来的所有验收测试都正常工作,并且还在添加更多。目前,我不知道从clvm_tools运行这些命令行工具的等效品时,有什么不应该真实的情况。
-
opc
-
opd
-
run
-
brun
-
repl
argparse已被移植到javascript,我相信我已经忠实地复制了它在cmds中的使用方式,因此命令行解析应该在这三个版本中工作得类似。
目录结构预计将是
src/classic <-- any ported code with heritage pointing back to
the original chia repo.
src/compiler <-- a newer compiler (ochialisp) with a simpler
structure. Select new style compilation by
including a `(include *standard-cl-21*)`
form in your toplevel `mod` form.
Mac M1
由于mac M1和其他平台处理python扩展的方式不同,请使用以下命令:cargo build --no-default-features
与chia-blockchain一起使用
# Activate your venv, then
$ maturin develop --release
依赖项
~16–30MB
~569K SLoC