Как сравнить тип данных msg.data (calldata) с целочисленным типом данных uint256?

По моему вопросу здесь :

Мне нужно сравнить msg.data (в частности, числа, отправленные с объектом данных sendTransaction) с типом данных uint256 в рамках моего контракта.

Как это возможно?

msg.data имеет типcalldata
Извините, но это не ответ на мой вопрос... Если кто-то отправляет число от 1 до 100 в мой контракт, используя объект данных в sendTransaction, как я могу сравнить его с uint256 в моем контракте?
Добро пожаловать в SE :) Я не знаю ответа, но я уверен, что найдется тот, кто знает. Просто пытаюсь быть точным, чтобы этому человеку было легче.
Спасибо, я ценю это. У меня есть другая учетная запись, но я потерял свои логины, лол.
хм, нет типа "calldata". Тип msg.data: bytesСм. глобальные переменные solidity.readthedocs.org/en/latest/miscellaneous.html .
Да, это байты, но их нельзя сразу преобразовать в другие типы данных, как обычный bytesтип.

Ответы (3)

Побайтовые сравнения. Нужны преобразования. ссылка реддит мертва. Зачем нужен msg.dataпрямой доступ?

РЕДАКТИРОВАТЬ: преобразовать uint256 из байтов calldata в правильный uint256 в Solidity: https://gist.github.com/anonymous/a734a5d299ffa7b5a834

РЕДАКТИРОВАТЬ: система набора текста и правила публикации на этом сайте очень странные. В любом случае это работает. Он всегда должен возвращать true.

Привет и добро пожаловать в Ethereum SE, ваш ответ выглядит как комментарий. Не могли бы вы добавить больше информации о конверсиях? Ссылку кстати исправил.
Я неправильно понял. Я думал, что единственный способ отправить данные в контракт — это использовать объект данных в sendTransaction. Почему этот контракт не отправляет мне 1 Finney обратно, когда я отправляю ему эту транзакцию, я не могу понять, почему нет: random.rand.sendTransaction(1,{from: eth.accounts[0], value: web3.toWei(.0001, 'ether'), to: '0x4abc14efad9a7a84a0a9ef6e1a782c43a9e3f550', gas: 500000, data: web3.fromAscii('message')}) Код контракта: gist.github.com/anonymous/e210a052b6b4c86337c2 Отлично, нет абзаца перерывы в комментариях.
Я проголосовал за этот ответ и предложения в следующий раз: включите сам фактический код (поскольку он не такой длинный) и дайте немного больше объяснений.

Спецификация для msg.dataEthereum 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» является передаваемым параметром, который затем можно легко сравнить внутри контракта с другими переменными. Спасибо за отзыв.

Поскольку вы передаете значение (5 эфиров), вы можете проверить его с помощью msg.value. ("значение" не является частью msg.data)
Кроме того, с помощью таких методов контрактаmyContract.myMethod(5, {from: eth.accounts[0]}) обычно проще передать данные (не значение) 5, чем напрямую eth.sendTransaction.
@eth извините, я обновил свой ответ, я передаю параметр в своем случае ответа - 2. Просто для подтверждения, это недоступно через msg.value. Правильный?
Правильно, "2" недоступен через msg.value. Но проще получить доступ к «2»: если ваша функция похожа, myMethod(int8 num)то num получит значение 2.