# 区块链编程需要注意的问题
虽然智能合约开发与传统开发语言比较类似,但编程时需要注意以下三个问题:
- 确定性(Deterministic)
确定性指的是一个程序每次给特定的输入会得到相同的输出,比如1+1=2,任何时候1+1都等于2。由于智能合约是运行在不同节点上的一段代码,因此必须确保代码输出结果的一致性。
- 可终止(Terminable)
由于区块链资源有限,为了避免垃圾代码和恶意程序占用资源,通过情况会引入经济机制限制资源的浪费。比如以太坊智能合约需要支付一定的GAS费,而EOS上需要购买内存(RAM),并通过抵押方式换取一定的CPU和NET资源。运行在区块链上的智能合约一定要避免重复循环执行,必须在给定的条件下终止程序。比如超过某一个时间或者超过一定的费用,合约自动终止。
- 代码隔离(Isolated)
在公链上,任何人都可以上传自己的智能合约,由于智能合约可能存在bug或者病毒,如果智能合约没有被隔离,就会影响整个区块链系统地运行,因此将智能合约运行在沙盒(SandBox)机制里可以有效避免合约对整个经济系统造成破坏。
以太坊虚拟机(EVM)是以太坊智能合约的运行环境。它不仅被沙盒封装起来,事实上它被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程,甚至智能合约之间也只有有限的调用。
EOS虚拟机采用的WebAssembly(WASM)是一个内存安全的沙盒执行环境虚拟机,为智能合约提供了安全保障。
超级账本Fabric使用了Docker来存放链上的代码,而不需要依靠特定的虚拟机,Docker为链码执行提供了一个安全、轻便的语言执行环境。
不同区块链使用的开发语言会有所不同,智能合约的特性也会有一些差别。