标签: ethereum

如何在以太坊获得帐户余额?

如何以编程方式发现以太坊区块链中给定帐户中的ETH量?

ethereum

43
推荐指数
1
解决办法
4万
查看次数

什么是智能合约的合适类型?

我想知道在Haskell或Idris等类型语言中表达智能合约的最佳方式是什么(例如,您可以将其编译为在以太坊网络上运行).我主要担心的是:哪种类型可以捕获合同可以执行的所有操作?

天真的解决方案:EthIO

一个天真的解决方案是将合同定义为EthIO类型的成员.这种类型就像Haskell一样IO,但它不是启用系统调用,而是包括区块链调用,即它可以读取和写入区块链的状态,调用其他合同,获取块数据等等.

-- incrementer.contract

main: EthIO
main = do
   x <- SREAD 0x123456789ABCDEF
   SSTORE (x + 1) 0x123456789ABCDEF
Run Code Online (Sandbox Code Playgroud)

这显然足以执行任何合同,但是:

  1. 太强大了.

  2. 特别是与以太坊区块链非常相关.

保守解决方案:事件采购模式

根据这个想法,合同将被定义为一系列行动的折叠:

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

41
推荐指数
2
解决办法
1227
查看次数

各种区块链协议之间的区别

由于开发人员不断使用区块链的不同网络协议,如Hyperledger,multihain,Ethereum,Corda等.如果开发人员和区块链爱好者可以提出如上所述的各种区块链之间的一些关键差异,社区将会很感激.

谢谢 !

blockchain ethereum hyperledger corda

39
推荐指数
4
解决办法
8103
查看次数

在以太坊Solidity中,"记忆"关键字的目的是什么?

在查看样本契约时,有时数组是在具有"记忆"的方法中声明的,有时则不是.有什么不同?

ethereum

38
推荐指数
3
解决办法
8732
查看次数

TestRPC/Ganache:tx没有正确的nonce

我最近一直在尝试使用松露,并遵循以下教程:http://truffleframework.com/tutorials/pet-shop

每当我尝试设置事务时,我都会在下面遇到相同的错误

错误:错误:tx没有正确的nonce.account hasce of:14 tx hasce of:0

在网上查看并阅读了很多与此相关的文章,但到目前为止还没有找到可能导致此问题的原因.

  • 松露v3.4.7
  • Solidity v0.4.13
  • Npm v5.3.0
  • TestRPC v4.0.1(也适用于Ganache)
  • Metamask v3.9.5

根据我的理解,它似乎无法找到以前的事务来散列新的事务?

node.js ethereum truffle metamask

31
推荐指数
2
解决办法
7122
查看次数

如何在solidity中生成随机数?

我有几个 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

但坚固性并不能仅仅做到这一点。有什么便宜又好用的东西吗?

string blockchain ethereum solidity smartcontracts

28
推荐指数
3
解决办法
6万
查看次数

ethers.js 合约实例中没有 safeTransferFrom 函数?

我在安全帽控制台中创建了一个合约实例,如下所示:

\n
const contract_fac = await ethers.getContractFactory("ContractName");\nconst contract = await contract_fac.attach("CONTRACTADDR...");\n
Run Code Online (Sandbox Code Playgroud)\n

合约对象具有除 之外的所有公共/外部函数safeTransferFrom。为什么?

\n

当我用它调用它时,它contract.safeTransferFrom(\xe2\x80\xa6)会抛出 JavaScript 错误 \xe2\x80\x9csafeTransferFrom 不是函数\xe2\x80\x9d。这是一个错误还是我不明白什么?safeTransferFrom函数在 ABI 中列出。

\n

我使用未做任何更改的 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

错误的:

\n
contract.safeTransferFrom(addr1, addr2, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

正确的:

\n
contract["safeTransferFrom(address,address,uint256)"](addr1, addr2, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

ethereum solidity openzeppelin ethers.js hardhat

28
推荐指数
1
解决办法
5233
查看次数

什么是Solidity中的地址(0)

任何人都可以向我解释什么address(0)是Solidity?我在文档中发现了以下内容,但它对我来说并不合理:

如果目标帐户是零帐户(地址为0的帐户),则该事务会创建新合同.如前所述,该合同的地址不是零地址,而是从发送方及其发送的交易数量("nonce")得出的地址.这种合同创建事务的有效负载被认为是EVM字节码并被执行.此执行的输出将永久存储为合同代码.这意味着,为了创建合同,您不发送合同的实际代码,而是实际返回该代码的代码.

http://solidity.readthedocs.io/en/develop/introduction-to-smart-contracts.html?highlight=address(0)#index-8

ethereum solidity ether

27
推荐指数
2
解决办法
9338
查看次数

以太坊什么时候会改用赌注证明?

以太坊目前使用GPU挖掘工作证明来保留区块链,但我已经读到,以太坊基金会和开发团队的目标是在未来的某个时刻转向利益证明.两者之间的区别是什么,以及何时进行切换?

ethereum

26
推荐指数
2
解决办法
2万
查看次数

在 ethers.js 中设置合约方法的 Gas 限制

问题

我试图在测试网络(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是否提供了对合约设置限制的功能?或者可以用其他方式做到这一点吗?我在文档中没有找到。

javascript ethereum ether ethers.js

26
推荐指数
2
解决办法
5万
查看次数