#integer #integer-overflow #motoko #internet-computer
Вопрос:
Чтение документов для Мотоко интернет-компьютера:
https://sdk.dfinity.org/docs/languages/motoko-at-a-glance.html#_bounded_numbers_trapping
Я понял, что у меня нет хорошей модели для того, что здесь означает слово «ловушка».:
Ограниченные числа (захват) Nat8, Nat16, Nat32, Nat64, Int8, Int16, Int32, Int64
ловушка на избыточном и недостаточном потоке
необходимо указать аннотации типов
литералы: 13, 0xf4, -20, 1_000_000
Означает ли это, что целое число останется фиксированным на максимуме/минимуме, если попытка записать число, которое вызовет переполнение/недостаточный поток?
Каково происхождение слова «ловушка» в этом контексте? И каково здесь его точное значение?
Ответ №1:
Ловушка в этом контексте приводит к прерыванию выполнения. Канистра по-прежнему будет в порядке, но вызов, сделанный канистре, завершится неудачей. См.Эту часть руководства.
В качестве демонстрации я настроил контейнер счетчика с типом Nat8 из одного из этих шаблонов, поэтому он должен поддерживать значения 0..255 включительно, и инициализировал его до 250:
$ cat counter-canister/main.mo
actor {
stable var currentValue: Nat8 = 250;
public func increment(): async () {
currentValue = 1;
};
public query func getValue(): async Nat8 {
currentValue;
};
};
Затем я нажал кнопку «увеличить». Он увеличился с 250 до 255, как и ожидалось, затем при следующем щелчке это появилось в консоли браузера:
vendor.e49a5b15.js:831 Uncaught (in promise) Error: Call was rejected:
Request ID: 0f549a49b80b31831e423196d086e36c12df51896ffaaa59e99bae7fa66047aa
Reject code: 5
Reject text: Canister ryjl3-tyaaa-aaaaa-aaaba-cai trapped explicitly: arithmetic overflow
at pollForResponse (vendor.e49a5b15.js:831)
at async n (vendor.e49a5b15.js:838)
at async HTMLButtonElement.n (index.4a11dcea.js:5)
Перезагрузка страницы показала, что значение по-прежнему было максимальным-255.
Канистра по-прежнему полностью функциональна. Если бы я потрудился также поместить туда кнопку уменьшения, я мог бы немного сократить время, а затем увеличить значение, пока снова не достигну предела.