По моему вопросу здесь :
Мне нужно сравнить msg.data (в частности, числа, отправленные с объектом данных sendTransaction) с типом данных uint256 в рамках моего контракта.
Как это возможно?
Побайтовые сравнения. Нужны преобразования. ссылка реддит мертва. Зачем нужен msg.data
прямой доступ?
РЕДАКТИРОВАТЬ: преобразовать uint256 из байтов calldata в правильный uint256 в Solidity: https://gist.github.com/anonymous/a734a5d299ffa7b5a834
РЕДАКТИРОВАТЬ: система набора текста и правила публикации на этом сайте очень странные. В любом случае это работает. Он всегда должен возвращать true.
Спецификация для msg.data
Ethereum Contract ABI .
Вот код из ответа, предоставленного Андреасом:
contract ReadConvertUint256Bytes {
function equal(uint a) constant returns (bool) {
uint x = 0;
for (uint i = 0; i < 32; i++) {
uint b = uint(msg.data[35 - i]);
x += b * 256**i;
}
return a == x;
}
}
Он начинает чтение с байта с индексом 35, потому что первые 4 байта (с индексами от 0 до 3) — это идентификатор метода (см. ABI выше), а внутри Ethereum все работает с обратным порядком байтов.
В то время как другие ответы могут предоставить инструменты, необходимые для дословного ответа на этот вопрос, моя проблема была решена, потому что я не знал о других способах отправки параметров в контракты на Ethereum. А именно: eth.sendTransaction(2{from: eth.accounts[0], value: web3.toWei(5, 'ether'), to: '0xXXXX', gas: 200000, data: web3.fromAscii('MinedBlock') })
При этом «2» является передаваемым параметром, который затем можно легко сравнить внутри контракта с другими переменными. Спасибо за отзыв.
msg.value
. ("значение" не является частью msg.data
)myContract.myMethod(5, {from: eth.accounts[0]})
обычно проще передать данные (не значение) 5, чем напрямую eth.sendTransaction
.myMethod(int8 num)
то num получит значение 2.
Тьяден Хесс
calldata
пользователь 2890278
Тьяден Хесс
пользователь 2890278
эт
bytes
См. глобальные переменные solidity.readthedocs.org/en/latest/miscellaneous.html .Тьяден Хесс
bytes
тип.