Publicación
Comparte tu conocimiento.
How to generate random Number between 1&2 without VRF?
So I was making a coinflip game which assigns head- 1 and tails -2 and when user places bet on polygon chain.... smart contract generates a random number between 1 and 2 and if the outcome is same...user gets double - (5 % as fee to the owner of contract) ! from a pool and if outcome is different then user loses all and the lost amount is deposited in the pool - (3% as fee to the owner) (to fund winners)... but any way to make genrate a random number? I have no funds at all so I can't afford chainlink VRF to generate. So is there any other secure way for this? plus I am pritty new to solidity so I made this code with help of chat gpt but I don't it works....can anyone help to make the code better? code-
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract CoinFlip {
address public owner;
uint256 public contractBalance;
event BetPlaced(address indexed player, uint256 amount, bool choice);
event BetResult(address indexed player, uint256 amount, bool won);
constructor() {
owner = msg.sender;
}
function placeBet(bool choice) external payable {
require(msg.value > 0, "Bet amount must be greater than 0");
bool outcome = (block.timestamp % 2 == 0); // Simple pseudo-random outcome
if (outcome == choice) {
uint256 winAmount = (msg.value * 2 * 95) / 100;
require(address(this).balance >= winAmount, "Insufficient contract balance");
payable(msg.sender).transfer(winAmount);
emit BetResult(msg.sender, winAmount, true);
} else {
uint256 lostAmount = (msg.value * 97) / 100;
contractBalance += lostAmount;
emit BetResult(msg.sender, msg.value, false);
}
emit BetPlaced(msg.sender, msg.value, choice);
}
function depositFunds() external payable {
require(msg.sender == owner, "Only owner can deposit funds");
contractBalance += msg.value;
}
function withdrawFunds(uint256 amount) external {
require(msg.sender == owner, "Only owner can withdraw funds");
require(amount <= address(this).balance, "Insufficient contract balance");
payable(owner).transfer(amount);
contractBalance -= amount;
}
}
- Smart Contract
- Solidity
Respuestas
1«pero ¿hay alguna forma de generar un número aleatorio?» - la verdad es que no, la mayoría de las cadenas de bloques y la EVM en particular tienen un diseño determinista. El código que has generado utiliza la marca de tiempo del bloque para crear aleatoriedad, pero se puede manipular con suficiente esfuerzo.
Algunos servicios, como chainlink, publican contenido aleatorio en la cadena de bloques para que lo usen otros contratos, básicamente actuando como un tercero con algunas garantías matemáticas. Existen alternativas a chainlink, pero utilizan enfoques muy similares y son mucho menos populares. Por lo tanto, si quieres una buena fuente de aleatoriedad en la cadena, es probable que chainlink sea tu mejor opción a partir de ahora. En caso de que solo estés aprendiendo solidez sin preocuparte por la seguridad, puedes probar el enfoque con la marca de tiempo como en el fragmento generado.
Sabes la respuesta?
Inicie sesión y compártalo.
Solidity is an object-oriented, high-level language for implementing smart contracts. It is a curly-bracket language designed to target the Ethereum Virtual Machine (EVM).
- My ERC721 contract successfully deploys, but I can't verify the contract's source code with hardhat21
- Solidity y ethers.js calculan diferentes direcciones a partir de la misma firma21
- no puedo entender cuáles son las ubicaciones (uint256)22
- Cómo revertir keccak256 en Solidity22
- Aclaración sobre los reembolsos de gas y comparación entre «requerir» y «revertir» en los contratos inteligentes21