Как получить «настоящий» блок-хэш от Solidity до Web3

#solidity #web3 #web3-java

Вопрос:

Я пытаюсь сохранить транзакции пользователя в контракте, как:

 function Donar() external payable{
    require(msg.value >= MINIMUM, "Minium amount is 0.05");
    bool nuevo = false;
    
    blockValue =  uint256(blockhash(block.number-1));//is a uint256
    //añadimos el nuevo mientro
    if(balances[msg.sender]<=0){
        users.push(msg.sender);
        nuevo = true;
    }
    balances[msg.sender]  =msg.value;
    emit Donation(msg.sender, balances[msg.sender], nuevo);
}
 

Но когда из Web3 js
Я пытаюсь получить доступ к Blockvalue, это возвращает мне другой результат, чем транзакция.

Если я совершу транзакцию «Donar», я получу, например, такую транзакцию: 0x5e99f8a0b2397a0d3e6024d42bc66ef7b0db776bdc3e5232ed8cb1dfccbcb28d

Но если я проверю значение блока, я получу следующее: 4546220900830919697224652387617135036690909309459187506831567695009831863640741

Я из JS попытался зашифровать в sha256, но затем получил другой результат, например 1c092b7a0d025a1754c4cf109668ff21a75e3b167f2a99f33747bf7b23b54b7f

Как я могу сохранить хэш транзакции в контракте?

Спасибо

Ответ №1:

blockhash это не то же самое, что sha256(blockNumber)

Это хэш всего блока (включая транзакции и метаданные), опубликованный майнером-победителем и используемый в качестве одного из входных данных для следующего блока. Отсюда — цепочка блоков.

Пример одного из недавних блоков: https://etherscan.io/block/13284032

  • Номер блока: 13284032
    • SHA256 из этого числа: 0x2ed065813c261f30844cfed7a49ad794b8517a71e9e108ae36b94514d6c978d6
  • Хэш блока: 0x778959bc43e97a43e525003cf54c07f4a333aceffdd763d9473ce158a2cf3a5a

Горячо, чтобы получить блок-хэш с помощью web3 (по крайней мере, в JS для вдохновения; Я вижу, что ваш вопрос помечен web3-java , но я не знаю Java):

 const Web3 = require('web3');
const web3 = new Web3('<provider URL>');
web3.eth.getBlock(13284032).then((block) => {
    console.log(block.hash);
});
 

Комментарии:

1. Но я хочу спасти его от солидности. Я знаю, как получить транзакцию с WEb3 после действия, но в том же вызове я хочу сохранить ее в контракте >.>>

2. Проблема не в web3. Находится в твердости. Я хочу сохранить транзакцию в целостности в том же действии, когда выполняю отправку. Чтобы избежать использования SQL или чего-то еще для сохранения данных в Интернете. Если я использую в солидности: blockValue = bytes32 (blockhash(блок.номер-1)); У меня другой результат, чем хэш реальной транзакции. >.>

3. Хэш транзакции @DanielRayos отличается от хэша блока. Но в настоящее время (v0.8) он недоступен в Solidity.

4. О, тогда в Солидности есть какой-нибудь способ получить транзакцию? :S

5. @DanielRayos Вы можете получить только два свойства транзакции: gasprice и origin . Дополнительную информацию смотрите в чит -листе.