Я использовал следующую функцию для преобразования байтов в uint:
function bytesToUint(bytes b) public pure returns (uint){
uint number;
for(uint i=0;i<b.length;i++){
number = number + uint(b[b.length-1-i])*(10**i);
}
return number;
}
Поскольку явное преобразование byte1 в uint больше не поддерживается, я нашел следующую альтернативу:
function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
require(_bytes.length >= (_start + 32), "Read out of bounds");
uint256 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
Байты вводятся в функцию ApproveAndCall токена ERC20.
function approveAndCall(address spender, uint tokens, bytes data) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, this, data);
return true;
}
который отправляется на получение одобрения моего смарт-контракта.
function receiveApproval(address _from, uint _token, address _tokenContract, bytes memory _data) public {
if(!ERC20Interface(_tokenContract).transferFrom(_from, address(this), _token)) {
revert();
}
_0xChangeLib.place_sell_order(exchange, _from, _tokenContract, _token, _0xChangeLib.toUint256(_data, 0));
}
Может кто-нибудь объяснить, как работает этот новый BytesToUint256? Я не могу разобраться в коде сборки и том, как использовать эту функцию. Я не понимаю аргумент uint256 _start. Я также не уверен, смогу ли я использовать в качестве ввода тот же формат, что и использовал. В качестве аргумента я преобразовывал количество wei в байты, например 100 wei = 0x100, с простой функцией в javascript и отправленной на адрес токена с помощью Web3.js.
Я хотел бы в функции ReceiveApproval смарт-контракта вызвать функцию BytesToUint для дальнейшей обработки данных.
Заранее большое спасибо за вашу помощь!
_start
- это просто начальное значение, которое нужно добавить, а неuint number = 0;
. Но я не вижу, чтобы он умножался на 10, поэтому похоже, что он просто складывает все цифры, игнорируя их разрядные значения. Или, может быть, он превращает массив целых цифр в строку ASCII как uint256? Но ASCII'0'
- это 0x30, а не 0x20, так что это не так. - person Peter Cordes   schedule 04.08.2020