#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
- SHA256 из этого числа:
- Хэш блока:
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
. Дополнительную информацию смотрите в чит -листе.