TL;DR:我从区块链,ethereum,web3环境开始,我对此非常兴奋,所以我想知道一些不清楚的事情。
我已经构建了我的第一个实体契约(一些商店合同),但是使用了硬编码的数据,所以我想知道,我应该从哪里获得数据,这样它就不是硬编码的了。例如:
如果我想为赢得X奖而创建一个稳固的合同,那么这个奖项将总是硬编码在合同中吗?
或者,如果我想签一份聪明的合同,去做一些像kickstarter (基金上涨)这样的事情,那么这些骆驼都住在哪里呢?
谢谢。
发布于 2021-03-19 18:38:52
这是一个非常抽象的问题,所以这是一个抽象的答案。
这份合同没有准备好生产.有些关注点被放在一边,专注于你可变的奖品关注点,帮助你开始工作。这场比赛本身并没有经过仔细的考虑。创作者用任意的奖金制作猜谜游戏。选手们试图猜出这个秘密词。
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.7.6;
contract XPrize {
struct Contest {
uint prizeMoney;
bool claimed;
}
mapping(bytes32 => Contest) public contests;
event NewContest(address sender, bytes32 contestId, uint prizeMoney);
event PrizeClaimed(address winner,bytes32 secret, bytes32 contestId, uint prizeMoney);
// STEP 2 - contest creator creates a contest with an arbitrary anount of funding.
function newContest(bytes32 contestId) public payable { // anyone can create a contest and fund it
Contest storage c = contests[contestId];
require(c.prizeMoney == 0, "contest is already defined.");
require(msg.value > 0, "send money");
c.prizeMoney = msg.value;
emit NewContest(msg.sender, contestId, msg.value);
}
// STEP 3 - guess the secret, claim the money
function claimPrize(bytes32 secret) public {
bytes32 key = hashHelper(secret);
Contest storage c = contests[key];
require(c.prizeMoney > 0, "there is no prize money there");
require(!c.claimed, "already paid out");
c.claimed = true;
emit PrizeClaimed(msg.sender,secret, key, c.prizeMoney);
msg.sender.transfer(c.prizeMoney);
}
// STEP 1 - contest creator generates a key with a secret that is hard to guess
function hashHelper(bytes32 secret) public view returns(bytes32) {
return keccak256(abi.encodePacked(secret, address(this)));
}
}这份合同是一台自动售货机,因为它既持有钱,也有释放它的机制。注意,它将奖金负债记录在数据结构中。有一堆现金“在盒子里”--这是一种协议级的会计,由Ethereum来处理--它知道有多少钱停在地址里。内部会计要求,例如,每个用户或每个游戏拖欠多少,是内部会计关注的问题。
希望能帮上忙。
https://ethereum.stackexchange.com/questions/94867
复制相似问题