智能合约设计原理
undefined
- 智能合约设计原理
undefined10.1 virtual machine & script
智能合约是由指令来组成的. 指令是通过虚拟机来执行的.
虚拟机分2种.
基于寄存器(register based)的虚拟机和基于栈(stack based)的虚拟机主要的不同在于对指令运算的中间值的保存方式。这些中间值包括各种运算的结果值,传给各个指令的参数等等。前者一般会设置几个寄存器,如累加寄存器;后者则没有寄存器,只有一个用来保存这些值的栈。
Stack based 虚拟机图示:
![image_1bv0veevacgg1q7evjm89nsjd9.png-107.8kB][28]
栈虚拟机主要包括以上三部分:虚拟机、指令集、外部接口。
其中虚拟机内部构造主要是数据、指令、堆栈三部分,指令对数据进行操作,将数据装载进堆栈中以备运算和处理。
基于栈的举例展示栈的变化:
![image_1bv11h6587ej161g1kq11v1pto9m.png-7.4kB][29]
基于栈的举例包括指令:
![image_1bv11vlmbt1i1sqg1km41ccm133g1j.png-78.5kB][30]
基于寄存器的举例图示:
![image_1bv128ju11hvbsq6ac210cj1qkk2d.png-48.8kB][31]
undefined循环代码翻译成Stack based machine的语言
一段循环代码
$i = 0; while($i <5 ) { $i++; }==>lable 1000 dup push 5 GT jmpz 2000 push 1 add jump 1000 lable 2000
跳跃点与跳跃示意:
$i = 0;while label 1000($i <5 ) jmpz 2000 (有条件跳){$i++; jump 1000}lable 2000
循环代码翻译过程解释
$i = 0; ==> push 0对于while循环, 分成条件和内容2部分, 也就有2个跳跃的地点跳跃的地点: while ... ===> lable 1000因为每次操作会吃掉一个数, 需要把i复制 $i ==> dup因为栈最上面与次上比较,反过来, 所以改为大于GT: < 5 ==> push 5 GT然后有条件跳跃: ) ==> jmpz 2000即i=i+1 : $i ++ ==> push 1 add; ==> jump 1000} lable 2000循环里可以嵌套发钱的函数:send(addr, money);发钱: push 10 push 2535624466 send
Fibbonacci
$a =1; $b = 1; while(1) { $c = $a + $b; print($c); $a = $b; $b = $c; }==>push 1 push 1 lable 1000dup swap2 dup // A B; A B B; B B A; B B A A;swap3 // A B A B;add dup print // A B C C;jump 1000
另一种简洁实现fibbonacci:
PUSH 1 PUSH 1 LABEL 1 DUP SWAP2 ADD JMP 1
a =500;b= 7;c=0;while(c<=500){if(c % 7 == 0)echo (c);c++;}push 500;push 7push 0duppush 500
undefined10.2 比特币 Bitcoin
Bitcoin uses a scripting system for transactions. Forth-like, Script is simple, stack-based, and processed from left to right. It is purposefully not Turing-complete, with no loops.
A script is essentially a list of instructions recorded with each transaction that describe how the next person wanting to spend the Bitcoins being transferred can gain access to them. The script for a typical Bitcoin transfer to destination Bitcoin address D simply encumbers future spending of the bitcoins with two things: the spender must provide
- a public key that, when hashed, yields destination address D embedded in the script, and
- a signature to show evidence of the private key corresponding to the public key just provided.
Scripting provides the flexibility to change the parameters of whats needed to spend transferred Bitcoins. For example, the scripting system could be used to require two private keys, or a combination of several, or even no keys at all.
脚本本质上是每个交易记录的指令列表,描述下一个想要花费比特币的人如何能够访问他们。一个典型的比特币转移到目的地的脚本比特币地址D简单地加载比特币的未来支出有两件事情:花费者必须提供
- 一个公钥,当散列时,产生嵌入在脚本中的目标地址D
一个签名显示与刚刚提供的公钥对应的私钥的证据。
脚本提供了更改传输比特币所需花费参数的灵活性。例如,脚本系统可以用来需要两个私人密钥,或几个,甚至没有任何密钥的组合。
BTC 起初想法有很多没有落实. 本来也有智能合约系统, 但不是图灵完备的.
智能合约系统不是按照账号,而是按照碎片设置智能合约. 后来因为引起安全漏洞,一部分关闭了. 还存在,但是有限制, 如果不符合2,3个模板的话,交易就会被拒绝.
而ETH保证了用户能创造图灵完备的合约.
我们设计的output里是address,amount. BTC还包括一个智能合约, 实现了数个模板功能:
1 Standard Transaction to Bitcoin address (pay-to-pubkey-hash)
2 Obsolete pay-to-pubkey transaction
3 Provably Unspendable/Prunable Outputs (钱锁定)
4 Anyone-Can-Spend Outputs (任何人都能花这笔钱)
5 Transaction puzzle (密码符合就可以得到钱)
其中1里的scriptPubKey相当于我们Output里的一个属性, 地址.
scriptSig, 是相当于input的一个属性,相当我们公钥,签名.
我们的地址是对公钥作md5. BTC采用的是个不同的算法.
CoinJoin
用来把钱混在一起, 区分不出来谁的钱
![image_1buvuo75f1ie51qbf9d21dulhf09.png-40.2kB][32]
undefined10.3 以太坊 Ethereum
2016年以太坊遭到攻击
白皮书内容不多, wiki更新不多.
复杂些的要自己去发现.
undefined区块特点
每17秒出现一个区块, 奖励不止给最快的人, 也发给其他挖区块的人. 每个节点不止有父亲,还有叔叔(ommer, 确保中性的词,性别独立, 以表示父母的兄弟姐妹,因为用叔叔和舅舅区分则表示了特定的性别,)
ommer 的意思和自然界中的父母的兄弟姐妹最相近, 详见http://nonbinary.org/wiki/Gender_neutral_language#Family_Terms
为了防止矿池大蒜粒, 运行之前付钱, 钱数不定.
为了避免网络滥用及回避由于图灵完整性而带来的一些
不可避免的问题,在以太坊中所有的程序执行都需要费用。
各种操作费用以gas (详见附录G ) 为单位计算。任意的程
序片段(包括合约创建、信息调回、利用及访问账户存储、
在虚拟机上执行操作等)都可以根据规则计算出消耗的燃
料数量。
运行越复杂, 需要的gas越多.
智能合约不会自己执行, 需要有人支付费用,呼叫它才能执行.
创造地址时,需要随机数字的, 如果知道了你的随机数字, 就有可能知道你
eth创造地址时也需要钱.
Message Call就是发送钱. 额度
智能合约和地址是一对一的形式.
EVM 是32字节, 256bit.
我们创造的是4字节.
执行模型具体说明怎么使用一系列字节代码指令和一个
小的环境数据元组去改变这个系统状态。这些是通过以太
坊虚拟机(Ethereum Virtual Machine - EVM), 这个虚拟
状态机来实现的。它是一个准图灵机, 说“准”是因为计算
会被燃料所限制。
9.1. 基础. EVM 基于栈结构, 机器的字大小(以及栈中数
据的大小)是256 位。主要是便于执行Keccak-256 位哈希
及椭圆曲线计算。内存模型基于字寻址的字节数据。栈的最
大深度为1024。EVM 也有一个独立的存储模型;类似内
存但更像一个字节数组, 一个基于字寻址的字数组。不像易
变的内存,存储是非易变的且是作为系统状态的一部分被
维护。所有内存和存储中的数据会初始化为0。
EVM 不是标准的诺依曼结构。它通过一个特别的指令
把程序代码保存在一个虚拟的可以交互的ROM 中, 而不是
保存在一般性可访问的内存或存储中。
对于一个账户的执行,内存总费用和需要的32 字节最
小倍数的内存量成正比, 即存1个字节也要32字节的费用.
undefinedETH没有挖矿机
比特币世界中一个灾难是ASICs。有一些计算硬件仅仅
是为了做一个简单的任务而存在。在比特币的案例中,这个
任务就是SHA256 哈希函数。当ASICs 为了工作量证明函
数而存在时,两个的目标都会变得危险。因此,一个可抵抗
ASIC 的工作量证明函数(比如难以在专用硬件上执行, 或
者在专用硬件执行时并不划算)可以作为众所周知的银弹。
防止ASIC 漏洞的两个方向:第一是去让它变成有序列
的内存困难,比如:设计一个函数, 确定随机数需要大量的
内存和带宽, 以至于这些内存不能被并行地去计算随机数。
第二个方向是让计算变得更普遍化; 对于这个普遍化的计
算, 使得特殊硬件和普通的桌面计算机计算起来都差不多。
有越多的机器加入,带宽越慢.(把整个世界看成1个机器,带宽有限)
EVM的每一步都是要付费的.
eos 号称效率比ETH高几十万倍.
智能合约的开发工具还不完善. 目前的都是在核心团队的指导下完成的.
这个技术在很早就存在的.
undefined10.4 仿照以太坊EVM扩充实现为32字节
仿照以太坊, 以黄皮书的技术规范进行设计. 我们设计的支持4字节的php代码就要扩充.
PUSH5 "hello"[0, 0, 0, 0, ..., h, e, l, l, o]PUSH32 0, 0, 0, ... "hello"[0, 0, 0, 0, ..., h, e, l, l, o]
