abort are two control flow constructs that end execution, one for the current function and one for the entire transaction.
More information on
return can be found in the linked section
abort is an expression that takes one argument: an abort code of type
u64. For example:
abort expression halts execution the current function and reverts all changes made to global state by the current transaction. There is no mechanism for "catching" or otherwise handling an
Luckily, in Move transactions are all or nothing, meaning any changes to global storage are made all at once only if the transaction succeeds. Because of this transactional commitment of changes, after an abort there is no need to worry about backing out changes. While this approach is lacking in flexibility, it is incredibly simple and predictable.
abort is useful for exiting control flow when some condition cannot be met.
In this example, the function will pop two items off of the vector, but will abort early if the vector does not have two items
This is even more useful deep inside a control-flow construct. For example, this function checks that all numbers in the vector are less than the specified
bound. And aborts otherwise
assert is a builtin, macro-like operation provided by the Move compiler. It takes two arguments, a condition of type
bool and a code of type
The operation does not exist at the bytecode level, and is replaced inside the compiler with
abort examples above can be rewritten using
abort, it is important to understand how the
u64 code will be used by the VM.
Normally, after successful execution, the Move VM produces a change-set for the changes made to global storage (added/removed resources, updates to existing resources, etc).
abort is reached, the VM will instead indicate an error. Included in that error will be two pieces of information
- The module that produced the abort (address and name)
- The abort code.
If a transaction, such as the script
always_aborts above, calls
0x2::Example::aborts, the VM would produce an error that indicated the module
0x2::Example and the code
This can be useful for having multiple aborts being grouped together inside a module.
In this example, the module has two separate error codes used in multiple functions
The type of
abort i expression can have any type! This is because both constructs break from the normal control flow, so they never need to evaluate to the value of that type.
The following are not useful, but they will type check
This behavior can be helpful in situations where you have a branching instruction that produces a value on some branches, but not all. For example: