function addNode(address _owner) external {
    uint256 checkpointCandidate;

    if (rewardStartTime == 0) {
      
      rewardStartTime = block.timestamp;
    } else {
      
      
      checkpointCandidate = rewardPerNode();
      require(checkpointCandidate > rewardCheckpoint || block.timestamp == rewardTimestamp);
    }

    
    sync(_owner);

    if (rewardCheckpoint != checkpointCandidate) {
      
      rewardCheckpoint = checkpointCandidate;
    }

    if (rewardTimestamp != block.timestamp) {
      
      rewardTimestamp = block.timestamp;
    }

    
    nodes[_owner] = nodes[_owner].add(1);

    
    claimed[_owner] = rewardCheckpoint.mul(nodes[_owner]);

    
    totalNodes = totalNodes.add(1);

    
    emit AddNode(_owner);
  }