Skip to content

Commit 82bd6a9

Browse files
committed
add some scrypt articles
1 parent 9d174ca commit 82bd6a9

File tree

5 files changed

+201
-0
lines changed

5 files changed

+201
-0
lines changed

i18n/zh-CN/docusaurus-plugin-content-docs/current/contract/bitcoin-scripts/turing-completeness.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,47 @@
22
sidebar_position: 7
33
---
44
# 图灵完备性
5+
6+
7+
Utxo合约图灵完备性论述。
8+
9+
加密生态一直存在一个误解,UTXO模型无法实现图灵完备的智能合约,最主要的论据就是UTXO模型不存在死循环,本文将针对图灵完备的问题进行解释。
10+
11+
## 什么是图灵完备
12+
13+
图灵完备是指一种计算机或编程语言的能力,能够模拟图灵机的所有功能。图灵机是一种理论计算机,由英国数学家图灵提出,它是一种理想化的计算模型,能够模拟任何计算机程序。图灵完备的编程语言能够实现任何计算机程序,包括递归函数、条件判断、循环等。
14+
15+
图灵机是一种理论计算机,由一个无限长的纸带和一个读写头组成。纸带上分布着一系列的符号,读写头可以读取和写入符号,并根据一系列的规则进行操作。图灵机的操作包括移动读写头、读取和写入符号、改变状态等。图灵机的操作规则是一种有限状态机,它可以根据当前的状态和读取的符号来决定下一步的操作。
16+
17+
那么根据图灵完备的定义,能够完整实现图灵机功能的就是图灵完备。注意这里存在一个前提,那就是**无限长**的纸带,它的实现前提是**无限**的内存或者执行时间。但是真实世界受限于物理规则,资源始终有限,真正意义上的解决所有可计算问题的计算机是不存在的。我们通常认可的图灵完备编程语言和程序,比如高级编程语言,ETH合约等,都不能实现无限的循环,也只能算是近似意义上的图灵完备。
18+
19+
以ETH合约为例,如果合约逻辑过于复杂或者循环次数过多,超过GAS limit,那么合约程序就会发生中断,导致无法继续执行出结果。ETH设置“GAS limit”的原因正是在于此,实际也不可能让合约无限制执行下去。
20+
21+
那么基于以上的论述,考虑实际计算资源和时间受限的情况下,我们其实真正讨论的是一种近似意义上的图灵完备,而不是真正意义上的图灵完备。在这种意义上,UTXO模型是可以实现近似意义上的图灵完备的,**账户模型可以实现的计算,UTXO模型都可以等价实现**
22+
23+
![图灵完备](/img/turing-machine.png)
24+
25+
## 执行范式的区别
26+
27+
BVM和EVM在合约执行范式上有所不同,用编程中的概念可以将EVM类比为(命令式编程),而BVM类比为(函数式编程)。
28+
29+
EVM命令式编程,就是通过一系列的命令来描述程序的执行过程,比如C语言,Java等。命令式编程的特点是程序的执行过程是由一系列的命令来描述的,程序的执行过程是可变的,在编译期也很难预期最终结果。EVM在触发合约的时候,会根据合约的代码逐步执行合约状态转换,直到代码执行完毕或者GAS消耗完毕,合约结束,整个过程可以完全由EVM自行完成。同时由于无法预期合约执行的步数,在发起合约交易的时候必须指定好GAS limit。其特点如下:
30+
31+
1. 合约的状态是全局的,合约的执行过程中需要维护全局状态,因此对同一状态的修改必须串行执行。
32+
2. 发起合约只需要一笔交易,合约内部的状态转移可以是多次的并且由EVM自动进行状态转移。
33+
3. 多笔合约的触发必须有严格的顺序依赖关系,不同顺序执行的合约可能会导致不同的结果。
34+
4. 发起合约的交易必须指定GAS limit,GAS limit设置的不同可能会导致运行结果不同。
35+
5. 合约执行失败也会花费GAS费,因为合约执行的过程已经由全网进行验证,GAS费已经消耗。
36+
37+
对比而言,BVM的函数式编程,就是通过一系列的函数来描述程序的执行过程,比如Haskell,Lisp等。函数式编程的特点是程序的执行过程是由一系列的函数来描述的,程序的执行过程是不可变的,函数的执行结果只与输入有关,不会受到外部环境的影响。同样,为了防止资源被耗尽,BVM在设置和触发合约的时候,**必须指定循环次数的上限**,在合约执行的时候,合约执行所需要的步数和结果都已经确定下来并不会发生改变。其特点如下:
38+
39+
1. 合约的状态是局部的,状态存储在函数(UTXO)中,不同的状态之间是相互独立的,可以并行执行。
40+
2. 状态随着每一次的交易而转移,每一次交易只会触发一次状态转移,无论合约内部的逻辑多复杂,状态转移多少次,BVM只会将最终的状态转移结果记录在链上。如果需要实现多个步骤的状态转移或者递归等特性需要多个交易,也就是多个函数调用链共同完成。BVM不会自动触发后续的状态转移。需要合约调用方(任何人都可以调用函数,但不是任何人都能成功解锁)构建链式并执行。
41+
3. 合约编写的时候,需要很多编译期常量,比如循环次数等,此常量规定了合约可以接受的最大循环次数,也就定义了此函数的边界,不会无限膨胀耗尽资源。
42+
4. 合约的执行结果只与输入有关,不会受到任何外部状态的影响,合约执行结果可以被拿到链下验证,每次的执行结果必然完全相同(可复现性)。
43+
5. 发起合约的时候所消耗的最大GAS或者手续费就已经确定了下来,在运行期不再发生任何改变。
44+
6. 失败的调用无法上链改变状态,可以认为BVM修改状态,要么不成功什么都不发生,要么成功修改状态。因此失败的调用不会消耗GAS费,也不会记录上链。
45+
46+
正由于BVM或者UTXO模型和函数式编程范式的特点,BVM的模型也就能够充分利用函数式编程的优势,保证合约的安全性和可预测性,同时也能够实现图灵完备的智能合约。函数式编程模式现在在很多关键领域,尤其是对性能和安全有双重要求的领域,都有着广泛的应用,比如金融,AI等,都凸显了越来越多的优势。很多现代编程语言也开始引入函数式编程的特性,比如Java,Rust,以提高程序的安全性,可预测性,还有健壮性。
47+
48+
综上,我们可以认为BVM可以实现等同于EVM的图灵完备性,任何在EVM上可以实现的计算,BVM都可以等价实现。同时,BVM的函数式编程模式也为合约的安全性和可预测性提供了更好的保障,也为合约的分析和调试提供了更多的便利。
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,146 @@
11
---
22
sidebar_position: 2
33
---
4+
45
# 基本语法
6+
7+
介绍Scrypt语言的基本语法和规则。
8+
9+
参考资料: https://scryptdoc.readthedocs.io/en/latest/
10+
11+
## 构造器
12+
13+
每一个合约只有一个构造器,用来初始化成员变量。如果没有构造器被指定的话,会生成一个默认的构造器,将所有的成员初始化。
14+
15+
![img.png](/img/scrypt-constructor.png)
16+
17+
## Require()
18+
19+
require函数指定合约条件,接受一个bool类型的参数,如果参数为false,就会中断合约执行并返回失败。
20+
21+
参数为true的时候就会校验通过。
22+
23+
## 公共函数
24+
25+
每一个合约都至少有一个Public
26+
function,这个函数并不返回值(void返回)。这个函数可以看作锁定脚本,也可以看作整个合约入口,只有当公共函数中的所有require条件都满足并正常结束的时候,合约才可以被解锁。
27+
28+
多个公共函数的情况下,可以看作这个合约有多个解锁方式,每个解锁方式都可以解锁这个输出。
29+
30+
## 基本数据结构
31+
32+
- Bool true or false
33+
- Int 任意长度的十进制或者16进制有符号整数
34+
- byte类型,以b加单引号开头的16进制格式,或者双引号包裹的utf8字符
35+
数组类型
36+
以逗号分隔,数组长度必须固定
37+
38+
```c
39+
bool[3] b = [false, false && true || false, true || (1 > 2)];
40+
int[3] c = [72, -4 - 1 - 40, 833 * (99 + 9901) + 8888];
41+
bytes[3] a = [b'ffee', b'11', b'22'];
42+
int[2][3] d = [[11, 12, 13], [21, 22, 23]];
43+
// array demension can be omitted when declared
44+
int[] e = [1, 4, 2]; // e is of type int[3]
45+
int[][] f = [[11, 12, 13], [21, 22, 23]]; // f is of type int[2][3]
46+
```
47+
48+
数组可以使用repeat函数将值置为相同的。
49+
50+
```text
51+
// a == [0, 0, 0]
52+
int[3] a = repeat(0, 3);
53+
```
54+
55+
数组可以使用index进行索引,索引从0开始,如果出现越界则直接判定合约失败。
56+
57+
两个数组可以认为完全相等,如果元素数量相同并且每个元素都相同。
58+
59+
## 结构体类型
60+
61+
结构体是一组变量成员,可以是基本数据结构也可以进行结构体嵌套。
62+
63+
使用数组的时候,直接使用.引用就可以获取成员变量。
64+
65+
类型推断:使用auto关键字将自动推断基本数据类型。
66+
67+
类型别名:可以给特定数据类型起别名。
68+
69+
## 范型
70+
71+
范型可以被定义在library和struct中,使用范型的时候,需要显示声明对应的类型。
72+
73+
```c
74+
library HashedMap<K, V> {
75+
// user them as function parameter's type
76+
function set(K k, V v, int idx) {
77+
...
78+
}
79+
}
80+
81+
struct ST<T,P> {
82+
T t;
83+
P p;
84+
}
85+
86+
```
87+
88+
## 领域类型
89+
90+
领域类型是基本类型的子类型,主要用于和比特币交易相关的类型,使用领域类型可以增强类型安全性。
91+
92+
- PublicKey:PubKey(b'0200112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100');
93+
- Sig sig = Sig(
94+
b'3045022100b71be3f1dc001e0a1ad65ed84e7a5a0bfe48325f2146ca1d677cf15e96e8b80302206d74605e8234eae3d4980fcd7b2fdc1c5b9374f0ce71dea38707fccdbd28cf7e41');
95+
- Ripemd160 r = Ripemd160(b'0011223344556677889999887766554433221100');
96+
- PubKeyHash aliceAddress = PubKeyHash(b'0011223344556677889999887766554433221100');
97+
- Sha1 s = Sha1(b'0011223344556677889999887766554433221100');
98+
- Sha256 s = Sha256(b'00112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100');
99+
- SigHashType s = SigHashType(b'01'); SigHashType s = SigHash.ALL | SigHash.ANYONECANPAY;
100+
- SigHashPreimage s = SigHashPreimage(b'0100000028bcef7e73248aa273db19d73');
101+
- OpCodeType s = OpCode.OP_DUP + OpCode.OP_ADD;
102+
- PrivKey privKey = PrivKey(0x00112233445566778899aabbccddeeffffeeddccbbaa99887766554433221100);
103+
104+
## 常量
105+
106+
常量声明之后无法修改
107+
108+
```text
109+
contract Test {
110+
const int x;
111+
112+
constuctor(int x) {
113+
this.x = x
114+
}
115+
116+
public function equal(const int y) {
117+
y = 1; // error
118+
const int a = 36;
119+
a = 11; // error
120+
}
121+
}
122+
```
123+
124+
## If 条件
125+
126+
if条件用于控制程序逻辑流,除了bool之外,int和bytes也可以使用if。int 0和byte b'', b'00'会被看作false。
127+
128+
## exit方法
129+
130+
exit方法提前结束函数逻辑,参数可以传入true或者false。
131+
132+
## Code Separator
133+
134+
三个或者更多 * 会插入一个OP_CODESEPARATOR操作符,这个操作会影响签名的计算。
135+
136+
## 访问控制
137+
138+
- Default: no keyword required
139+
- Private
140+
- Public: only applies to functions
141+
142+
| Access Level | Same Contract | Other Contract | Externally |
143+
|--------------|---------------|----------------|------------|
144+
| Default | Yes | Yes | No |
145+
| Private | Yes | No | No |
146+
| Public | Yes | Yes | Yes |
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
11
---
22
sidebar_position: 1
33
---
4+
45
# sCrypt 语言介绍
6+
7+
介绍MVC合约的编程语言sCrypt。
8+
9+
> 注意: sCrypt语言最新版已经使用typescript作为底层语言,因此sCrypt语言的语法与typescript语法类似。TypeScript版本在MVC上处于集成中的状态,知识库也会根据新版SDK的开发进度进行更新。
10+
11+
12+
sCrypt(发音为“ess crypt”)是一种面向Bitcoin Virtual
13+
Machine的高级智能合约语言。比特币支持使用类似Forth堆栈的Script语言编写智能合约。然而,用原生Script编写智能合约既繁琐又容易出错。当合约的规模和复杂性增加时,这种问题会变得难以处理。
14+
15+
sCrypt旨在简化在链上运行智能合约的编写过程。
16+
17+
它易于学习。在语法上,sCrypt类似于Javascript和Solidity,使现有的网页和智能合约开发者更容易接受和使用。
18+
19+
它是静态类型的。类型检查可以在编译时检测到许多错误。

static/img/scrypt-constructor.png

101 KB
Loading

0 commit comments

Comments
 (0)