关于我创建的智能合约的几个问题(刚刚开始学习)

时间:2018-01-07 02:53:02

标签: ethereum solidity smartcontracts

我刚刚开始学习可靠性,并对我为实践/乐趣创建的智能合约有一些疑问。 如果我的任何概念都不准确,请告诉我,并感谢所有的建议和建议。

描述

这个智能合约的概念非常简单,无论谁在合同中输入更多的以太币,它都会将你与你之前的任何人配对(如果没有人在你之前,你是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会发生吗?从我的理解 聪明的合同不必担心竞争条件和它    永远不应该处于那种状态?

    1. 添加可播放的播放是否正确? (因为用户打算通过此电话发送以太网)
  • 使用抛出一种不好的做法? (混音警告)

  • 转移vs发送,为什么使用转移更好?

  • 我把这个智能合约编成了一种做法。我已经可以看到了 有人想要对系统进行游戏,他可以等待有人成为p​​layer_one并检查玩家数量发送量(在块被开采之后)并且只发送一个更大的总和。无论如何,这个漏洞可以被阻止吗?我还没有看到其他安全/缺陷吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

向用户发送以太币时,我是否需要计算多少气体?   要采取?或智能合约会自动扣除燃气   从我要发送的金额

执行交易时指定的气体限制需要涵盖端到端的所有活动。这包括对其他合同的调用,转移等。交易后未使用的任何天然气都将退还给您。

  

将reset()设置为interal是正确的,因为我只想要它   在智能合约中召集,不应该被任何人调用   其他

internal适用于您打算做的事情。但是,它更像protected访问权限。分包合同可以调用internal方法。 private提供最严格的可见性。

  

情景#1会发生吗?从我理解的聪明   合同不必担心竞争条件,它永远不应该   在那个州?

不,不应该发生。你是正确的,交易是连续处理的,所以你不必担心竞争条件。这并不意味着您不应该在代码中使用这种保护......

  

添加可播放的播放是否正确? (因为用户要发送   以太跟这个电话)

是。任何期望接收wei并使用msg.value的方法都需要标记为payable

  

使用抛出一种不好的做法? (混音警告)

throw已弃用。您希望使用revertrequireassert中的一个,自0.4.13开始。您使用的那个取决于您正在进行的检查类型以及是否应该退还燃气。有关详细信息,请参阅this

  

转移vs发送,为什么使用转移更好?

sendtransfer相似。不同之处在于send限制了发送到呼叫的气体量,因此如果接收合同试图执行任何逻辑,则很可能耗尽气体并且失败。此外,send期间的失败不会传播错误,只返回falseSource

  

我把这个智能合约编成了一种做法。我已经可以看到了   有人想要对系统进行游戏,他可以等待某人   player_one并检查玩家数量发送量(块之后)   开采)只是发送一个更大的总和。无论如何还有这个   利用可以停止?我还没有看到其他安全/缺陷吗?

安全是一个更深入的话题。事务中发送的任何数据都是可见的,因此除非使用私有区块链,否则无法隐藏您提到的漏洞。您可以自己加密事务中发送的数据,但我不相信您可以加密发送以太。

就其他安全问题而言,有几种工具可以对合同进行安全检查。我建议调查其中一个。另外,请仔细阅读Solidity文档中的security considerations页面。