我想知道在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
我有几个 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
但坚固性并不能仅仅做到这一点。有什么便宜又好用的东西吗?
运行测试和脚本时,所有函数均由 Hardhat 提供的第一个地址调用。
我想知道是否有办法在同一测试或脚本中更改调用地址。
提前致谢!
我试图将我简单的可靠性智能合约部署到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) 我运行了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' …
我正在尝试通过使用 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) 在 Solidity 中,我们有四种访问类型。其中两个是private和internal。如果两者都可以在智能合约中使用,但部署后都不可见,有什么区别?
我正在尝试通过元掩码和 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)”。
我正在使用testrpc和松露来测试我的合同.
当我输入时truffle migrate,这会将我的合同部署到testrpc网络.
我的问题是,哪个帐户(来自testrpc帐户)已用于部署合同.
换句话说,谁的合同所有者?
先感谢您