标签: smartcontracts

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

我想知道在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
查看次数

如何在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万
查看次数

如何找出以太坊地址是否合同?

Solidity中的地址可以是帐户或合同(或其他事物,例如交易).当我有一个变量x,持有一个地址时,我该如何测试它是否是合同?

(是的,我已经阅读了关于 doc中类型章节)

ethereum solidity smartcontracts

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

如何使用不同的地址来调用 Hardhat 测试和脚本中的函数?

运行测试和脚本时,所有函数均由 Hardhat 提供的第一个地址调用。

我想知道是否有办法在同一测试或脚本中更改调用地址。

提前致谢!

ethereum solidity smartcontracts ethers.js hardhat

18
推荐指数
1
解决办法
6039
查看次数

UnhandledPromiseRejectionWarning:错误:无法存储合同代码,请检查您的气体限制

我试图将我简单的可靠性智能合约部署到Rinkeby网络上,但我一直收到错误:

UnhandledPromiseRejectionWarning:错误:无法存储合同代码,请检查您的气体限制.

我的可靠性代码很简单

pragma solidity ^0.4.18; 

contract Greetings{ 
  string public message; 

  function Greetings(string initialMessage) public{ 
    message = initialMessage;
  }  

  function setMessage(string newMessage) public {
    message = newMessage;
  }  
}
Run Code Online (Sandbox Code Playgroud)

我的部署脚本是:

const HDWalletProvider = require('truffle-hdwallet-provider'); 
const Web3 = require('web3');
const { interface,bytecode} = require('./compile');

const provider = new HDWalletProvider(  
  'twelve word mnemonic...', 
  'https://rinkeby.infura.io/GLm6McXWuaih4gqq8nTY'    
);

const web3 = new Web3(provider);

const deploy = async () => {
    accounts = await web3.eth.getAccounts(); 

    console.log('attempting to deploy from account',accounts[0]);

    const result = await new web3.eth.Contract(JSON.parse(interface)) …
Run Code Online (Sandbox Code Playgroud)

node.js ethereum solidity smartcontracts

15
推荐指数
2
解决办法
2812
查看次数

Solana 测试程序锚点测试失败 tsconfig.json"&gt; 需要类型为“json”的导入断言

我运行了anchor test --skip-deploy,它应该做的就是初始化我的程序,但我得到的只是这个错误,我无法解决。我检查了 tsconfig.json 设置,它们应该没问题。这只是默认的锚点设置,我不会在任何地方导入任何不寻常的 JSON 文件。

锚点测试 --skip-deploy BPF SDK:/Users/julia/.local/share/solana/install/releases/1.9.5/solana-release/bin/sdk/bpf Cargo-build-bpf 子项:rustup 工具链列表 - v Cargo-build-bpf 子项:cargo +bpf build --target bpfel-unknown-unknown --release 警告:未使用的变量:ctx -->programs/feeRedeemCounter/src/lib.rs:8:23 | 8 | pub fn 初始化(ctx: Context) -> ProgramResult { | ^^^ 帮助:如果这是故意的,请在其前面添加下划线:_ctx | = 注意: #[warn(unused_variables)]默认开启

警告:feeRedeemCounter(lib)生成了 1 个警告在 1.28s 中完成了发布 [优化] 目标 Cargo-build-bpf 子项:/Users/julia/.local/share/solana/install/releases/1.9.5/solana-release /bin/sdk/bpf/dependencies/bpf-tools/llvm/bin/llvm-readelf --dyn-symbols /Users/julia/Downloads/anchorTutorial/feeRedeemCounter/target/deploy/fee_redeem_counter.so

要部署此程序: $ solana program deploy /Users/julia/Downloads/anchorTutorial/feeRedeemCounter/target/deploy/fee_redeem_counter.so 程序地址将默认为此密钥对(使用 --program-id 覆盖):/Users/julia/ Downloads/anchorTutorial/feeRedeemCounter/target/deploy/fee_redeem_counter-keypair.json 纱线运行 v1.22.17 警告 package.json:没有许可证字段 $ /Users/julia/Downloads/anchorTutorial/feeRedeemCounter/node_modules/.bin/ts-mocha -p ./tsconfig.json -t 1000000 '测试/**/*.ts' …

testing anchor rust smartcontracts solana

14
推荐指数
1
解决办法
4434
查看次数

该交易声明链 ID 5777,但连接的节点位于 1337

我正在尝试通过使用 python 进行交易,将我的 SimpleStorage.sol 合约部署到 ganache 本地链。连接到链条似乎有问题。

from solcx import compile_standard
from web3 import Web3
import json
import os
from dotenv import load_dotenv

load_dotenv()

with open("./SimpleStorage.sol", "r") as file:
    simple_storage_file = file.read()

compiled_sol = compile_standard(
    {
        "language": "Solidity",
        "sources": {"SimpleStorage.sol": {"content": simple_storage_file}},
        "settings": {
            "outputSelection": {
                "*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}
            }
        },
    },
    solc_version="0.6.0",
)

with open("compiled_code.json", "w") as file:
    json.dump(compiled_sol, file)


# get bytecode
bytecode = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["evm"][
    "bytecode"
]["object"]


# get ABI
abi = compiled_sol["contracts"]["SimpleStorage.sol"]["SimpleStorage"]["abi"]

# to …
Run Code Online (Sandbox Code Playgroud)

python ethereum solidity smartcontracts ganache

13
推荐指数
3
解决办法
1万
查看次数

Solidity 中的内部和私有有什么区别?

在 Solidity 中,我们有四种访问类型。其中两个是privateinternal。如果两者都可以在智能合约中使用,但部署后都不可见,有什么区别?

blockchain solidity smartcontracts

12
推荐指数
2
解决办法
8839
查看次数

如何使用 ethers.js 将 ETH 发送到合约函数?

我正在尝试通过元掩码和 ethers.js 从网络应用程序将 ETH 发送到合约函数。到目前为止我已经尝试过:

const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const splitterManager = new ethers.Contract(contract.address, contract.abi, signer);
var overrides = {value: 5}
const result = await splitterManager.newSplitter(addresses, shares, erc20, overrides);
console.log(result);
Run Code Online (Sandbox Code Playgroud)

但我不断收到“错误:未为 ENS 名称配置解析器或地址(参数=“名称”,值=“”,代码= INVALID_ARGUMENT,版本=合同/ 5.2.0)”。

ethereum solidity smartcontracts ethers.js

12
推荐指数
3
解决办法
1万
查看次数

谁是使用松露部署的合同的所有者?

我正在使用testrpc和松露来测试我的合同.

当我输入时truffle migrate,这会将我的合同部署到testrpc网络.

我的问题是,哪个帐户(来自testrpc帐户)已用于部署合同.

换句话说,谁的合同所有者?

先感谢您

solidity smartcontracts truffle

11
推荐指数
1
解决办法
3510
查看次数