我想知道在Haskell或Idris等类型语言中表达智能合约的最佳方式是什么(例如,您可以将其编译为在以太坊网络上运行).我主要担心的是:哪种类型可以捕获合同可以执行的所有操作?
一个天真的解决方案是将合同定义为EthIO类型的成员.这种类型就像Haskell一样IO,但它不是启用系统调用,而是包括区块链调用,即它可以读取和写入区块链的状态,调用其他合同,获取块数据等等.
-- incrementer.contract
main: EthIO
main = do
x <- SREAD 0x123456789ABCDEF
SSTORE (x + 1) 0x123456789ABCDEF
Run Code Online (Sandbox Code Playgroud)
这显然足以执行任何合同,但是:
太强大了.
特别是与以太坊区块链非常相关.
根据这个想法,合同将被定义为一系列行动的折叠:
type Contract action state = {
act : UserID -> action -> state -> state,
init : state
}
Run Code Online (Sandbox Code Playgroud)
所以,程序看起来像:
incrementer.contract
main : Contract
main = {
act _ _ state = state + 1,
init = 0
}
Run Code Online (Sandbox Code Playgroud)
也就是说,您可以定义初始状态,操作类型以及用户提交操作时该状态的更改方式.这将允许人们定义任何不涉及发送/接收资金的任意合同.大多数区块链都有某种货币,大多数有用的合约都是以某种方式涉及金钱,所以这种类型的限制性太强了.
我们可以通过将货币逻辑硬编码到上面的类型中来使上述类型知道货币.因此,我们得到类似的东西:
type Contract action state = {
act : UserID -> …Run Code Online (Sandbox Code Playgroud) haskell functional-programming idris ethereum smartcontracts