我刚刚开始学习可靠性,并对我为实践/乐趣创建的智能合约有一些疑问。 如果我的任何概念都不准确,请告诉我,并感谢所有的建议和建议。
描述:
这个智能合约的概念非常简单,无论谁在合同中输入更多的以太币,它都会将你与你之前的任何人配对(如果没有人在你之前,你是player_one)它会重置播放2个播放器后(因此可以再次播放)
代码:
contract zero_one {
address public player_one;
address public player_two;
uint public player_one_amount;
uint public player_two_amount;
function zero_one() public{
reset();
}
function play() public payable{
//Scenario #1 Already have two player in game, dont accpet new player. do I even need this check at all? since smart contract execute serially i should never face this condition?
if(player_one != address(0) && player_two != address(0)) throw;
//Scenario #2 First player enter the game
else if(player_one == address(0) && player_two == address(0)){
player_one=msg.sender;
player_one_amount = msg.value;
}
//Scenario #3 Second player join in, execute the game
else{
player_two = msg.sender;
player_two_amount = msg.value;
//check the amount send from player_one and player two, whoever has the bigger amount win and get their money
if(player_two_amount>player_one_amount){
player_one.transfer(player_one_amount+player_two_amount);
reset();
}
else if(player_two_amount<player_one_amount){
player_two.transfer(player_one_amount+player_two_amount);
reset();
}
else{
//return fund back to both player
player_one.transfer(player_one_amount);
player_two.transfer(player_two_amount);
reset();
}
}
}
function reset() internal{
player_one = address(0);
player_two = address(0);
player_one_amount = 0;
player_two_amount = 0;
}
}
问题
向用户发送以太网时,是否需要计算多少 天然气将采取?或智能合约会自动扣除 来自我要发送的金额的气体
将reset()设置为interal是正确的,因为我只想要它 在智能合约中调用,不应由其他任何人调用
情景#1会发生吗?从我的理解 聪明的合同不必担心竞争条件和它 永远不应该处于那种状态?
使用抛出一种不好的做法? (混音警告)
转移vs发送,为什么使用转移更好?
我把这个智能合约编成了一种做法。我已经可以看到了 有人想要对系统进行游戏,他可以等待有人成为player_one并检查玩家数量发送量(在块被开采之后)并且只发送一个更大的总和。无论如何,这个漏洞可以被阻止吗?我还没有看到其他安全/缺陷吗?
谢谢!
答案 0 :(得分:3)
向用户发送以太币时,我是否需要计算多少气体? 要采取?或智能合约会自动扣除燃气 从我要发送的金额
执行交易时指定的气体限制需要涵盖端到端的所有活动。这包括对其他合同的调用,转移等。交易后未使用的任何天然气都将退还给您。
将reset()设置为interal是正确的,因为我只想要它 在智能合约中召集,不应该被任何人调用 其他
internal
适用于您打算做的事情。但是,它更像protected
访问权限。分包合同可以调用internal
方法。 private
提供最严格的可见性。
情景#1会发生吗?从我理解的聪明 合同不必担心竞争条件,它永远不应该 在那个州?
不,不应该发生。你是正确的,交易是连续处理的,所以你不必担心竞争条件。这并不意味着您不应该在代码中使用这种保护......
添加可播放的播放是否正确? (因为用户要发送 以太跟这个电话)
是。任何期望接收wei并使用msg.value
的方法都需要标记为payable
。
使用抛出一种不好的做法? (混音警告)
throw
已弃用。您希望使用revert
,require
,assert
中的一个,自0.4.13开始。您使用的那个取决于您正在进行的检查类型以及是否应该退还燃气。有关详细信息,请参阅this。
转移vs发送,为什么使用转移更好?
send
和transfer
相似。不同之处在于send
限制了发送到呼叫的气体量,因此如果接收合同试图执行任何逻辑,则很可能耗尽气体并且失败。此外,send
期间的失败不会传播错误,只返回false
。 Source
我把这个智能合约编成了一种做法。我已经可以看到了 有人想要对系统进行游戏,他可以等待某人 player_one并检查玩家数量发送量(块之后) 开采)只是发送一个更大的总和。无论如何还有这个 利用可以停止?我还没有看到其他安全/缺陷吗?
安全是一个更深入的话题。事务中发送的任何数据都是可见的,因此除非使用私有区块链,否则无法隐藏您提到的漏洞。您可以自己加密事务中发送的数据,但我不相信您可以加密发送以太。
就其他安全问题而言,有几种工具可以对合同进行安全检查。我建议调查其中一个。另外,请仔细阅读Solidity文档中的security considerations页面。