我想知道在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
由于开发人员不断使用区块链的不同网络协议,如Hyperledger,multihain,Ethereum,Corda等.如果开发人员和区块链爱好者可以提出如上所述的各种区块链之间的一些关键差异,社区将会很感激.
谢谢 !
我最近一直在尝试使用松露,并遵循以下教程:http://truffleframework.com/tutorials/pet-shop
每当我尝试设置事务时,我都会在下面遇到相同的错误
错误:错误:tx没有正确的nonce.account hasce of:14 tx hasce of:0
在网上查看并阅读了很多与此相关的文章,但到目前为止还没有找到可能导致此问题的原因.
根据我的理解,它似乎无法找到以前的事务来散列新的事务?
我有几个 keccak,如果我能找到一种便宜的方法来获取所创建的 uint 的一部分,那么它们可以减少到一个。
pragma solidity ^0.4.19;
contract test {
function test() {
}
function sup() returns (uint test) {
uint _test = uint(keccak256("wow"));
return _test;
}
}
Run Code Online (Sandbox Code Playgroud)
这会返回一个甜蜜的随机数:13483274892375982735325
现在的计划是,我不用用不同的“种子”调用 keccak 5 次,而是可以将该数字分开并得到类似:1348、3274、8923 等的内容,然后将其用作我的随机数,例如:1348 % 10
但坚固性并不能仅仅做到这一点。有什么便宜又好用的东西吗?
我在安全帽控制台中创建了一个合约实例,如下所示:
\nconst contract_fac = await ethers.getContractFactory("ContractName");\nconst contract = await contract_fac.attach("CONTRACTADDR...");\nRun Code Online (Sandbox Code Playgroud)\n合约对象具有除 之外的所有公共/外部函数safeTransferFrom。为什么?
当我用它调用它时,它contract.safeTransferFrom(\xe2\x80\xa6)会抛出 JavaScript 错误 \xe2\x80\x9csafeTransferFrom 不是函数\xe2\x80\x9d。这是一个错误还是我不明白什么?safeTransferFrom函数在 ABI 中列出。
我使用未做任何更改的 OpenZeppelin (v. 4.2) 721 令牌模板、Ethers.js (v. 5.4.1) 和 Hardhat (v. 2.4.1)。
\n更新: \n问题已解决。safeTransferFrom 是一个重载函数。在 ethers 中,调用重载合约函数的语法与非重载函数不同。\n Ethers.js doc
\n错误的:
\ncontract.safeTransferFrom(addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n正确的:
\ncontract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);\nRun Code Online (Sandbox Code Playgroud)\n 任何人都可以向我解释什么address(0)是Solidity?我在文档中发现了以下内容,但它对我来说并不合理:
如果目标帐户是零帐户(地址为0的帐户),则该事务会创建新合同.如前所述,该合同的地址不是零地址,而是从发送方及其发送的交易数量("nonce")得出的地址.这种合同创建事务的有效负载被认为是EVM字节码并被执行.此执行的输出将永久存储为合同代码.这意味着,为了创建合同,您不发送合同的实际代码,而是实际返回该代码的代码.
以太坊目前使用GPU挖掘工作证明来保留区块链,但我已经读到,以太坊基金会和开发团队的目标是在未来的某个时刻转向利益证明.两者之间的区别是什么,以及何时进行切换?
我试图在测试网络(ropsten)上使用合约的方法,但由于以下错误而失败:
原因:'无法估计气体;交易可能失败或可能需要手动气体限制',代码:'UNPREDICTABLE_GAS_LIMIT'
我创建了一个智能合约的实例,并想调用它的注册方法:
const registrationContract = new ethers.Contract(ADDRESS, abi, signer);
const hashedDomain = utils.keccak256(utils.toUtf8Bytes(domain));
const register = await registrationContract.register(hashedDomain, walletAddress);
Run Code Online (Sandbox Code Playgroud)
ethers.js是否提供了对合约设置限制的功能?或者可以用其他方式做到这一点吗?我在文档中没有找到。
ethereum ×10
solidity ×3
blockchain ×2
ether ×2
ethers.js ×2
corda ×1
hardhat ×1
haskell ×1
hyperledger ×1
idris ×1
javascript ×1
metamask ×1
node.js ×1
openzeppelin ×1
string ×1
truffle ×1