libra_client 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +51 -0
- data/LICENSE.txt +21 -0
- data/README.md +57 -0
- data/Rakefile +10 -0
- data/bin/console +16 -0
- data/bin/setup +8 -0
- data/gen_proto.sh +2 -0
- data/lib/libra/access_path.rb +51 -0
- data/lib/libra/account_address.rb +29 -0
- data/lib/libra/account_config.rb +57 -0
- data/lib/libra/account_resource.rb +38 -0
- data/lib/libra/mnemonic.rb +147 -0
- data/lib/libra/version.rb +3 -0
- data/lib/libra_client.rb +173 -0
- data/libra_client.gemspec +49 -0
- data/libra_client.sublime-project +16 -0
- data/proto-lib/access_path_pb.rb +17 -0
- data/proto-lib/account_state_blob_pb.rb +23 -0
- data/proto-lib/admission_control_pb.rb +37 -0
- data/proto-lib/admission_control_services_pb.rb +37 -0
- data/proto-lib/events_pb.rb +35 -0
- data/proto-lib/get_with_proof_pb.rb +88 -0
- data/proto-lib/ledger_info_pb.rb +31 -0
- data/proto-lib/mempool_status_pb.rb +21 -0
- data/proto-lib/proof_pb.rb +41 -0
- data/proto-lib/transaction_info_pb.rb +19 -0
- data/proto-lib/transaction_pb.rb +102 -0
- data/proto-lib/validator_change_pb.rb +19 -0
- data/proto-lib/vm_errors_pb.rb +215 -0
- data/protos/access_path.proto +11 -0
- data/protos/account_state_blob.proto +16 -0
- data/protos/admission_control.proto +76 -0
- data/protos/events.proto +38 -0
- data/protos/get_with_proof.proto +310 -0
- data/protos/ledger_info.proto +82 -0
- data/protos/mempool_status.proto +21 -0
- data/protos/proof.proto +72 -0
- data/protos/transaction.proto +170 -0
- data/protos/transaction_info.proto +26 -0
- data/protos/validator_change.proto +27 -0
- data/protos/vm_errors.proto +276 -0
- metadata +191 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
/// Even though we don't always need all hashes, we pass them in and return them
|
9
|
+
/// always so that we keep them in sync on the client and don't make the client
|
10
|
+
/// worry about which one(s) to pass in which cases
|
11
|
+
///
|
12
|
+
/// This structure serves a dual purpose.
|
13
|
+
///
|
14
|
+
/// First, if this structure is signed by 2f+1 validators it signifies the state
|
15
|
+
/// of the ledger at version `version` -- it contains the transaction
|
16
|
+
/// accumulator at that version which commits to all historical transactions.
|
17
|
+
/// This structure may be expanded to include other information that is derived
|
18
|
+
/// from that accumulator (e.g. the current time according to the time contract)
|
19
|
+
/// to reduce the number of proofs a client must get.
|
20
|
+
///
|
21
|
+
/// Second, the structure contains a `consensus_data_hash` value. This is the
|
22
|
+
/// hash of an internal data structure that represents a block that is voted on
|
23
|
+
/// by consensus.
|
24
|
+
///
|
25
|
+
/// Combining these two concepts when the consensus algorithm votes on a block B
|
26
|
+
/// it votes for a LedgerInfo with the `version` being the latest version that
|
27
|
+
/// will be committed if B gets 2f+1 votes. It sets `consensus_data_hash` to
|
28
|
+
/// represent B so that if those 2f+1 votes are gathered, the block is valid to
|
29
|
+
/// commit
|
30
|
+
message LedgerInfo {
|
31
|
+
// Current latest version of the system
|
32
|
+
uint64 version = 1;
|
33
|
+
|
34
|
+
// Root hash of transaction accumulator at this version
|
35
|
+
bytes transaction_accumulator_hash = 2;
|
36
|
+
|
37
|
+
// Hash of consensus-specific data that is opaque to all parts of the system
|
38
|
+
// other than consensus. This is needed to verify signatures because
|
39
|
+
// consensus signing includes this hash
|
40
|
+
bytes consensus_data_hash = 3;
|
41
|
+
|
42
|
+
// The block id of the last committed block corresponding to this ledger info.
|
43
|
+
// This field is not particularly interesting to the clients, but can be used
|
44
|
+
// by the validators for synchronization.
|
45
|
+
bytes consensus_block_id = 4;
|
46
|
+
|
47
|
+
// Epoch number corresponds to the set of validators that are active for this
|
48
|
+
// ledger info. The main motivation for keeping the epoch number in the
|
49
|
+
// LedgerInfo is to ensure that the client has enough information to verify
|
50
|
+
// that the signatures for this info are coming from the validators that
|
51
|
+
// indeed form a quorum. Without epoch number a potential attack could reuse
|
52
|
+
// the signatures from the validators in one epoch in order to sign the wrong
|
53
|
+
// info belonging to another epoch, in which these validators do not form a
|
54
|
+
// quorum. The very first epoch number is 0.
|
55
|
+
uint64 epoch_num = 5;
|
56
|
+
|
57
|
+
// Timestamp that represents the microseconds since the epoch (unix time) that is
|
58
|
+
// generated by the proposer of the block. This is strictly increasing with every block.
|
59
|
+
// If a client reads a timestamp > the one they specified for transaction expiration time,
|
60
|
+
// they can be certain that their transaction will never be included in a block in the future
|
61
|
+
// (assuming that their transaction has not yet been included)
|
62
|
+
uint64 timestamp_usecs = 6;
|
63
|
+
}
|
64
|
+
|
65
|
+
/// The validator node returns this structure which includes signatures
|
66
|
+
/// from each validator to confirm the state. The client needs to only pass
|
67
|
+
/// back the LedgerInfo element since the validator node doesn't need to know
|
68
|
+
/// the signatures again when the client performs a query, those are only there
|
69
|
+
/// for the client to be able to verify the state
|
70
|
+
message LedgerInfoWithSignatures {
|
71
|
+
// Signatures of the root node from each validator
|
72
|
+
repeated ValidatorSignature signatures = 1;
|
73
|
+
|
74
|
+
LedgerInfo ledger_info = 2;
|
75
|
+
}
|
76
|
+
|
77
|
+
message ValidatorSignature {
|
78
|
+
// The account address of the validator, which can be used for retrieving its
|
79
|
+
// public key during the given epoch.
|
80
|
+
bytes validator_id = 1;
|
81
|
+
bytes signature = 2;
|
82
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package mempool;
|
7
|
+
|
8
|
+
enum MempoolAddTransactionStatus {
|
9
|
+
// Transaction was sent to Mempool
|
10
|
+
Valid = 0;
|
11
|
+
// The sender does not have enough balance for the transaction.
|
12
|
+
InsufficientBalance = 1;
|
13
|
+
// Sequence number is old, etc.
|
14
|
+
InvalidSeqNumber = 2;
|
15
|
+
// Mempool is full (reached max global capacity)
|
16
|
+
MempoolIsFull = 3;
|
17
|
+
// Account reached max capacity per account
|
18
|
+
TooManyTransactions = 4;
|
19
|
+
// Invalid update. Only gas price increase is allowed
|
20
|
+
InvalidUpdate = 5;
|
21
|
+
}
|
data/protos/proof.proto
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
import "transaction_info.proto";
|
9
|
+
|
10
|
+
message AccumulatorProof {
|
11
|
+
// The bitmap indicating which siblings are default. 1 means non-default and
|
12
|
+
// 0 means default. The LSB corresponds to the sibling at the bottom of the
|
13
|
+
// accumulator. The leftmost 1-bit corresponds to the sibling at the level
|
14
|
+
// just below root level in the accumulator, since this one is always
|
15
|
+
// non-default.
|
16
|
+
uint64 bitmap = 1;
|
17
|
+
|
18
|
+
// The non-default siblings. The ones near the root are at the beginning of
|
19
|
+
// the list.
|
20
|
+
repeated bytes non_default_siblings = 2;
|
21
|
+
}
|
22
|
+
|
23
|
+
message SparseMerkleProof {
|
24
|
+
// This proof can be used to authenticate whether a given leaf exists in the
|
25
|
+
// tree or not. In Rust:
|
26
|
+
// - If this is `Some(HashValue, HashValue)`
|
27
|
+
// - If the first `HashValue` equals requested key, this is an inclusion
|
28
|
+
// proof and the second `HashValue` equals the hash of the
|
29
|
+
// corresponding account blob.
|
30
|
+
// - Otherwise this is a non-inclusion proof. The first `HashValue` is
|
31
|
+
// the only key that exists in the subtree and the second `HashValue`
|
32
|
+
// equals the hash of the corresponding account blob.
|
33
|
+
// - If this is `None`, this is also a non-inclusion proof which indicates
|
34
|
+
// the subtree is empty.
|
35
|
+
//
|
36
|
+
// In protobuf, this leaf field should either be
|
37
|
+
// - empty, which corresponds to None in the Rust structure.
|
38
|
+
// - exactly 64 bytes, which corresponds to Some<(HashValue, HashValue)>
|
39
|
+
// in the Rust structure.
|
40
|
+
bytes leaf = 1;
|
41
|
+
|
42
|
+
// The bitmap indicating which siblings are default. 1 means non-default and
|
43
|
+
// 0 means default. The MSB of the first byte corresponds to the sibling at
|
44
|
+
// the top of the Sparse Merkle Tree. The rightmost 1-bit of the last byte
|
45
|
+
// corresponds to the sibling at the bottom, since this one is always
|
46
|
+
// non-default.
|
47
|
+
bytes bitmap = 2;
|
48
|
+
|
49
|
+
// The non-default siblings. The ones near the root are at the beginning of
|
50
|
+
// the list.
|
51
|
+
repeated bytes non_default_siblings = 3;
|
52
|
+
}
|
53
|
+
|
54
|
+
// The complete proof used to authenticate a signed transaction.
|
55
|
+
message SignedTransactionProof {
|
56
|
+
AccumulatorProof ledger_info_to_transaction_info_proof = 1;
|
57
|
+
TransactionInfo transaction_info = 2;
|
58
|
+
}
|
59
|
+
|
60
|
+
// The complete proof used to authenticate an account state.
|
61
|
+
message AccountStateProof {
|
62
|
+
AccumulatorProof ledger_info_to_transaction_info_proof = 1;
|
63
|
+
TransactionInfo transaction_info = 2;
|
64
|
+
SparseMerkleProof transaction_info_to_account_proof = 3;
|
65
|
+
}
|
66
|
+
|
67
|
+
// The complete proof used to authenticate an event.
|
68
|
+
message EventProof {
|
69
|
+
AccumulatorProof ledger_info_to_transaction_info_proof = 1;
|
70
|
+
TransactionInfo transaction_info = 2;
|
71
|
+
AccumulatorProof transaction_info_to_event_proof = 3;
|
72
|
+
}
|
@@ -0,0 +1,170 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
import "access_path.proto";
|
9
|
+
import "events.proto";
|
10
|
+
import "proof.proto";
|
11
|
+
import "transaction_info.proto";
|
12
|
+
import "google/protobuf/wrappers.proto";
|
13
|
+
|
14
|
+
// A generic structure that describes a transaction that a client submits
|
15
|
+
message RawTransaction {
|
16
|
+
// Sender's account address
|
17
|
+
bytes sender_account = 1;
|
18
|
+
// Sequence number of this transaction corresponding to sender's account.
|
19
|
+
uint64 sequence_number = 2;
|
20
|
+
oneof payload {
|
21
|
+
// The transaction script to execute.
|
22
|
+
Program program = 3;
|
23
|
+
// A write set, used for genesis blocks and other magic transactions.
|
24
|
+
// This bypasses the rules for regular transactions so will typically be
|
25
|
+
// rejected. Only under special circumstances will it be accepted.
|
26
|
+
WriteSet write_set = 4;
|
27
|
+
}
|
28
|
+
// Maximal total gas specified by wallet to spend for this transaction.
|
29
|
+
uint64 max_gas_amount = 5;
|
30
|
+
// The price to be paid for each unit of gas.
|
31
|
+
uint64 gas_unit_price = 6;
|
32
|
+
// Expiration time for this transaction. If storage is queried and
|
33
|
+
// the time returned is greater than or equal to this time and this
|
34
|
+
// transaction has not been included, you can be certain that it will
|
35
|
+
// never be included.
|
36
|
+
// If set to 0, there will be no expiration time
|
37
|
+
uint64 expiration_time = 7;
|
38
|
+
}
|
39
|
+
|
40
|
+
// The code for the transaction to execute
|
41
|
+
message Program {
|
42
|
+
bytes code = 1;
|
43
|
+
repeated TransactionArgument arguments = 2;
|
44
|
+
repeated bytes modules = 3;
|
45
|
+
}
|
46
|
+
|
47
|
+
// An argument to the transaction if the transaction takes arguments
|
48
|
+
message TransactionArgument {
|
49
|
+
enum ArgType {
|
50
|
+
U64 = 0;
|
51
|
+
ADDRESS = 1;
|
52
|
+
STRING = 2;
|
53
|
+
BYTEARRAY = 3;
|
54
|
+
}
|
55
|
+
ArgType type = 1;
|
56
|
+
bytes data = 2;
|
57
|
+
}
|
58
|
+
|
59
|
+
// A generic structure that represents signed RawTransaction
|
60
|
+
message SignedTransaction {
|
61
|
+
// The serialized Protobuf bytes for RawTransaction, for which the signature
|
62
|
+
// was signed. Protobuf doesn't guarantee the serialized bytes is canonical
|
63
|
+
// across different language implementations, but for our use cases for
|
64
|
+
// transaction it is not necessary because the client is the only one to
|
65
|
+
// produce this bytes, which is then persisted in storage.
|
66
|
+
bytes raw_txn_bytes = 1;
|
67
|
+
// public key that corresponds to RawTransaction::sender_account
|
68
|
+
bytes sender_public_key = 2;
|
69
|
+
// signature for the hash
|
70
|
+
bytes sender_signature = 3;
|
71
|
+
}
|
72
|
+
|
73
|
+
message SignedTransactionWithProof {
|
74
|
+
// The version of the returned signed transaction.
|
75
|
+
uint64 version = 1;
|
76
|
+
|
77
|
+
// The transaction itself.
|
78
|
+
SignedTransaction signed_transaction = 2;
|
79
|
+
|
80
|
+
// The proof authenticating the signed transaction.
|
81
|
+
SignedTransactionProof proof = 3;
|
82
|
+
|
83
|
+
// The events yielded by executing the transaction, if requested.
|
84
|
+
EventsList events = 4;
|
85
|
+
}
|
86
|
+
|
87
|
+
// A generic structure that represents a block of transactions originated from a
|
88
|
+
// particular validator instance.
|
89
|
+
message SignedTransactionsBlock {
|
90
|
+
// Set of Signed Transactions
|
91
|
+
repeated SignedTransaction transactions = 1;
|
92
|
+
// Public key of the validator that created this block
|
93
|
+
bytes validator_public_key = 2;
|
94
|
+
// Signature of the validator that created this block
|
95
|
+
bytes validator_signature = 3;
|
96
|
+
}
|
97
|
+
|
98
|
+
// Set of WriteOps to save to storage.
|
99
|
+
message WriteSet {
|
100
|
+
// Set of WriteOp for storage update.
|
101
|
+
repeated WriteOp write_set = 1;
|
102
|
+
}
|
103
|
+
|
104
|
+
// Write Operation on underlying storage.
|
105
|
+
message WriteOp {
|
106
|
+
// AccessPath of the write set.
|
107
|
+
AccessPath access_path = 1;
|
108
|
+
// The value of the write op. Empty if `type` is Delete.
|
109
|
+
bytes value = 2;
|
110
|
+
// WriteOp type.
|
111
|
+
WriteOpType type = 3;
|
112
|
+
}
|
113
|
+
|
114
|
+
// Type of write operation
|
115
|
+
enum WriteOpType {
|
116
|
+
// The WriteOp is to create/update the field from storage.
|
117
|
+
Write = 0;
|
118
|
+
// The WriteOp is to delete the field from storage.
|
119
|
+
Delete = 1;
|
120
|
+
}
|
121
|
+
|
122
|
+
// Account state as a whole.
|
123
|
+
// After execution, updates to accounts are passed in this form to storage for
|
124
|
+
// persistence.
|
125
|
+
message AccountState {
|
126
|
+
// Account address
|
127
|
+
bytes address = 1;
|
128
|
+
// Account state blob
|
129
|
+
bytes blob = 2;
|
130
|
+
}
|
131
|
+
|
132
|
+
// Transaction struct to commit to storage
|
133
|
+
message TransactionToCommit {
|
134
|
+
// The signed transaction which was executed
|
135
|
+
SignedTransaction signed_txn = 1;
|
136
|
+
// State db updates
|
137
|
+
repeated AccountState account_states = 2;
|
138
|
+
// Events yielded by the transaction.
|
139
|
+
repeated Event events = 3;
|
140
|
+
// The amount of gas used.
|
141
|
+
uint64 gas_used = 4;
|
142
|
+
}
|
143
|
+
|
144
|
+
// A list of consecutive transactions with proof. This is mainly used for state
|
145
|
+
// synchronization when a validator would request a list of transactions from a
|
146
|
+
// peer, verify the proof, execute the transactions and persist them. Note that
|
147
|
+
// the transactions are supposed to belong to the same epoch E, otherwise
|
148
|
+
// verification will fail.
|
149
|
+
message TransactionListWithProof {
|
150
|
+
// The list of transactions.
|
151
|
+
repeated SignedTransaction transactions = 1;
|
152
|
+
|
153
|
+
// The list of corresponding TransactionInfo objects.
|
154
|
+
repeated TransactionInfo infos = 2;
|
155
|
+
|
156
|
+
// The list of corresponding Event objects (only present if fetch_events was set to true in req)
|
157
|
+
EventsForVersions events_for_versions = 3;
|
158
|
+
|
159
|
+
// If the list is not empty, the version of the first transaction.
|
160
|
+
google.protobuf.UInt64Value first_transaction_version = 4;
|
161
|
+
|
162
|
+
// The proofs of the first and last transaction in this chunk. When this is
|
163
|
+
// used for state synchronization, the validator who requests the transactions
|
164
|
+
// will provide a version in the request and the proofs will be relative to
|
165
|
+
// the given version. When this is returned in GetTransactionsResponse, the
|
166
|
+
// proofs will be relative to the ledger info returned in
|
167
|
+
// UpdateToLatestLedgerResponse.
|
168
|
+
AccumulatorProof proof_of_first_transaction = 5;
|
169
|
+
AccumulatorProof proof_of_last_transaction = 6;
|
170
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
// `TransactionInfo` is the object we store in the transaction accumulator. It
|
9
|
+
// consists of the transaction as well as the execution result of this
|
10
|
+
// transaction. This are later returned to the client so that a client can
|
11
|
+
// validate the tree
|
12
|
+
message TransactionInfo {
|
13
|
+
// Hash of the signed transaction that is stored
|
14
|
+
bytes signed_transaction_hash = 1;
|
15
|
+
|
16
|
+
// The root hash of Sparse Merkle Tree describing the world state at the end
|
17
|
+
// of this transaction
|
18
|
+
bytes state_root_hash = 2;
|
19
|
+
|
20
|
+
// The root hash of Merkle Accumulator storing all events emitted during this
|
21
|
+
// transaction.
|
22
|
+
bytes event_root_hash = 3;
|
23
|
+
|
24
|
+
// The amount of gas used by this transaction.
|
25
|
+
uint64 gas_used = 4;
|
26
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
import "events.proto";
|
9
|
+
import "ledger_info.proto";
|
10
|
+
|
11
|
+
// This is used to prove validator changes. When a validator is changing, it
|
12
|
+
// triggers an event on /validator_change_account/events/sent. To tell the
|
13
|
+
// client about validator changes, we query
|
14
|
+
// /validator_change_account/events/sent to get all versions that contain
|
15
|
+
// validator changes after the version that we are trying to update from. For
|
16
|
+
// each of these versions, the old validator set would have signed the ledger
|
17
|
+
// info at that version. The client needs this as well as the event results +
|
18
|
+
// proof. The client can then verify that these events were under the current
|
19
|
+
// tree and that the changes were signed by the old validators (and that the
|
20
|
+
// events correctly show which validators are the new validators).
|
21
|
+
//
|
22
|
+
// This message represents a single validator change event and the proof that
|
23
|
+
// corresponds to it
|
24
|
+
message ValidatorChangeEventWithProof {
|
25
|
+
LedgerInfoWithSignatures ledger_info_with_sigs = 1;
|
26
|
+
EventWithProof event_with_proof = 2;
|
27
|
+
}
|
@@ -0,0 +1,276 @@
|
|
1
|
+
// Copyright (c) The Libra Core Contributors
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
3
|
+
|
4
|
+
syntax = "proto3";
|
5
|
+
|
6
|
+
package types;
|
7
|
+
|
8
|
+
// The statuses and errors produced by the VM can be categorized into a
|
9
|
+
// couple different types:
|
10
|
+
// 1. Validation Statuses: all the errors that can (/should) be
|
11
|
+
// the result of executing the prologue -- these are primarily used by
|
12
|
+
// the vm validator and AC.
|
13
|
+
// 2. Verification Errors: errors that are the result of performing
|
14
|
+
// bytecode verification (happens at the time of publishing).
|
15
|
+
// 3. VM Invariant Errors: errors that arise from an internal invariant of
|
16
|
+
// the VM being violated. These signify a problem with either the VM or
|
17
|
+
// bytecode verifier.
|
18
|
+
// 4. Binary Errors: errors that can occur during the process of
|
19
|
+
// deserialization of a transaction.
|
20
|
+
// 5. Runtime Statuses: errors that can arise from the execution of a
|
21
|
+
// transaction (assuming the prologue executes without error). These are
|
22
|
+
// errors that can occur during execution due to things such as division
|
23
|
+
// by zero, running out of gas, etc. These do not signify an issue with
|
24
|
+
// the VM.
|
25
|
+
|
26
|
+
// NB: we make a distinction between a status and an error here: A
|
27
|
+
// status contains errors, along with possible affirmation of a successful
|
28
|
+
// execution or valid prologue.
|
29
|
+
|
30
|
+
// The status of a transaction as determined by the prologue.
|
31
|
+
enum VMValidationStatusCode {
|
32
|
+
// We don't want the default value to be valid
|
33
|
+
UnknownValidationStatus = 0;
|
34
|
+
// The transaction has a bad signature
|
35
|
+
InvalidSignature = 1;
|
36
|
+
// Bad account authentication key
|
37
|
+
InvalidAuthKey = 2;
|
38
|
+
// Sequence number is too old
|
39
|
+
SequenceNumberTooOld = 3;
|
40
|
+
// Sequence number is too new
|
41
|
+
SequenceNumberTooNew = 4;
|
42
|
+
// Insufficient balance to pay minimum transaction fee
|
43
|
+
InsufficientBalanceForTransactionFee = 5;
|
44
|
+
// The transaction has expired
|
45
|
+
TransactionExpired = 6;
|
46
|
+
// The sending account does not exist
|
47
|
+
SendingAccountDoesNotExist = 7;
|
48
|
+
// This write set transaction was rejected because it did not meet the
|
49
|
+
// requirements for one.
|
50
|
+
RejectedWriteSet = 8;
|
51
|
+
// This write set transaction cannot be applied to the current state.
|
52
|
+
InvalidWriteSet = 9;
|
53
|
+
// Length of program field in raw transaction exceeded max length
|
54
|
+
ExceededMaxTransactionSize = 10;
|
55
|
+
// This script is not on our whitelist of script.
|
56
|
+
UnknownScript = 11;
|
57
|
+
// Transaction is trying to publish a new module.
|
58
|
+
UnknownModule = 12;
|
59
|
+
// Max gas units submitted with transaction exceeds max gas units bound
|
60
|
+
// in VM
|
61
|
+
MaxGasUnitsExceedsMaxGasUnitsBound = 13;
|
62
|
+
// Max gas units submitted with transaction not enough to cover the
|
63
|
+
// intrinsic cost of the transaction.
|
64
|
+
MaxGasUnitsBelowMinTransactionGasUnits = 14;
|
65
|
+
// Gas unit price submitted with transaction is below minimum gas price
|
66
|
+
// set in the VM.
|
67
|
+
GasUnitPriceBelowMinBound = 15;
|
68
|
+
// Gas unit price submitted with the transaction is above the maximum
|
69
|
+
// gas price set in the VM.
|
70
|
+
GasUnitPriceAboveMaxBound = 16;
|
71
|
+
}
|
72
|
+
|
73
|
+
message VMValidationStatus {
|
74
|
+
VMValidationStatusCode code = 1;
|
75
|
+
string message = 2;
|
76
|
+
}
|
77
|
+
|
78
|
+
message VMVerificationStatusList {
|
79
|
+
repeated VMVerificationStatus status_list = 1;
|
80
|
+
}
|
81
|
+
|
82
|
+
message VMVerificationStatus {
|
83
|
+
enum StatusKind {
|
84
|
+
SCRIPT = 0;
|
85
|
+
MODULE = 1;
|
86
|
+
}
|
87
|
+
StatusKind status_kind = 1;
|
88
|
+
// For StatusKind::SCRIPT this is ignored.
|
89
|
+
uint32 module_idx = 2;
|
90
|
+
VMVerificationErrorKind error_kind = 3;
|
91
|
+
string message = 4;
|
92
|
+
}
|
93
|
+
|
94
|
+
// When a code module/script is published it is verified. These are the
|
95
|
+
// possible errors that can arise from the verification process.
|
96
|
+
enum VMVerificationErrorKind {
|
97
|
+
// Likewise default to a unknown verification error
|
98
|
+
UnknownVerificationError = 0;
|
99
|
+
IndexOutOfBounds = 1;
|
100
|
+
RangeOutOfBounds = 2;
|
101
|
+
InvalidSignatureToken = 3;
|
102
|
+
InvalidFieldDefReference = 4;
|
103
|
+
RecursiveStructDefinition = 5;
|
104
|
+
InvalidResourceField = 6;
|
105
|
+
InvalidFallThrough = 7;
|
106
|
+
JoinFailure = 8;
|
107
|
+
NegativeStackSizeWithinBlock = 9;
|
108
|
+
UnbalancedStack = 10;
|
109
|
+
InvalidMainFunctionSignature = 11;
|
110
|
+
DuplicateElement = 12;
|
111
|
+
InvalidModuleHandle = 13;
|
112
|
+
UnimplementedHandle = 14;
|
113
|
+
InconsistentFields = 15;
|
114
|
+
UnusedFields = 16;
|
115
|
+
LookupFailed = 17;
|
116
|
+
VisibilityMismatch = 18;
|
117
|
+
TypeResolutionFailure = 19;
|
118
|
+
TypeMismatch = 20;
|
119
|
+
MissingDependency = 21;
|
120
|
+
PopReferenceError = 22;
|
121
|
+
PopResourceError = 23;
|
122
|
+
ReleaseRefTypeMismatchError = 24;
|
123
|
+
BrTypeMismatchError = 25;
|
124
|
+
AssertTypeMismatchError = 26;
|
125
|
+
StLocTypeMismatchError = 27;
|
126
|
+
StLocUnsafeToDestroyError = 28;
|
127
|
+
RetUnsafeToDestroyError = 29;
|
128
|
+
RetTypeMismatchError = 30;
|
129
|
+
FreezeRefTypeMismatchError = 31;
|
130
|
+
FreezeRefExistsMutableBorrowError = 32;
|
131
|
+
BorrowFieldTypeMismatchError = 33;
|
132
|
+
BorrowFieldBadFieldError = 34;
|
133
|
+
BorrowFieldExistsMutableBorrowError = 35;
|
134
|
+
CopyLocUnavailableError = 36;
|
135
|
+
CopyLocResourceError = 37;
|
136
|
+
CopyLocExistsBorrowError = 38;
|
137
|
+
MoveLocUnavailableError = 39;
|
138
|
+
MoveLocExistsBorrowError = 40;
|
139
|
+
BorrowLocReferenceError = 41;
|
140
|
+
BorrowLocUnavailableError = 42;
|
141
|
+
BorrowLocExistsBorrowError = 43;
|
142
|
+
CallTypeMismatchError = 44;
|
143
|
+
CallBorrowedMutableReferenceError = 45;
|
144
|
+
PackTypeMismatchError = 46;
|
145
|
+
UnpackTypeMismatchError = 47;
|
146
|
+
ReadRefTypeMismatchError = 48;
|
147
|
+
ReadRefResourceError = 49;
|
148
|
+
ReadRefExistsMutableBorrowError = 50;
|
149
|
+
WriteRefTypeMismatchError = 51;
|
150
|
+
WriteRefResourceError = 52;
|
151
|
+
WriteRefExistsBorrowError = 53;
|
152
|
+
WriteRefNoMutableReferenceError = 54;
|
153
|
+
IntegerOpTypeMismatchError = 55;
|
154
|
+
BooleanOpTypeMismatchError = 56;
|
155
|
+
EqualityOpTypeMismatchError = 57;
|
156
|
+
ExistsResourceTypeMismatchError = 58;
|
157
|
+
BorrowGlobalTypeMismatchError = 59;
|
158
|
+
BorrowGlobalNoResourceError = 60;
|
159
|
+
MoveFromTypeMismatchError = 61;
|
160
|
+
MoveFromNoResourceError = 62;
|
161
|
+
MoveToSenderTypeMismatchError = 63;
|
162
|
+
MoveToSenderNoResourceError = 64;
|
163
|
+
CreateAccountTypeMismatchError = 65;
|
164
|
+
// The self address of a module the transaction is publishing is not the sender address
|
165
|
+
ModuleAddressDoesNotMatchSender = 66;
|
166
|
+
// The module does not have any module handles. Each module or script must have at least one module handle.
|
167
|
+
NoModuleHandles = 67;
|
168
|
+
}
|
169
|
+
|
170
|
+
// These are errors that the VM might raise if a violation of internal
|
171
|
+
// invariants takes place.
|
172
|
+
enum VMInvariantViolationError {
|
173
|
+
UnknownInvariantViolationError = 0;
|
174
|
+
OutOfBoundsIndex = 1;
|
175
|
+
OutOfBoundsRange = 2;
|
176
|
+
EmptyValueStack = 3;
|
177
|
+
EmptyCallStack = 4;
|
178
|
+
PCOverflow = 5;
|
179
|
+
LinkerError = 6;
|
180
|
+
LocalReferenceError = 7;
|
181
|
+
StorageError = 8;
|
182
|
+
}
|
183
|
+
|
184
|
+
// Errors that can arise from binary decoding (deserialization)
|
185
|
+
enum BinaryError {
|
186
|
+
UnknownBinaryError = 0;
|
187
|
+
Malformed = 1;
|
188
|
+
BadMagic = 2;
|
189
|
+
UnknownVersion = 3;
|
190
|
+
UnknownTableType = 4;
|
191
|
+
UnknownSignatureType = 5;
|
192
|
+
UnknownSerializedType = 6;
|
193
|
+
UnknownOpcode = 7;
|
194
|
+
BadHeaderTable = 8;
|
195
|
+
UnexpectedSignatureType = 9;
|
196
|
+
DuplicateTable = 10;
|
197
|
+
}
|
198
|
+
|
199
|
+
//*************************
|
200
|
+
// Runtime errors/status
|
201
|
+
//*************************
|
202
|
+
|
203
|
+
enum RuntimeStatus {
|
204
|
+
UnknownRuntimeStatus = 0;
|
205
|
+
Executed = 1;
|
206
|
+
OutOfGas = 2;
|
207
|
+
// We tried to access a resource that does not exist under the account.
|
208
|
+
ResourceDoesNotExist = 3;
|
209
|
+
// We tried to create a resource under an account where that resource
|
210
|
+
// already exists.
|
211
|
+
ResourceAlreadyExists = 4;
|
212
|
+
// We accessed an account that is evicted.
|
213
|
+
EvictedAccountAccess = 5;
|
214
|
+
// We tried to create an account at an address where an account already
|
215
|
+
// exists.
|
216
|
+
AccountAddressAlreadyExists = 6;
|
217
|
+
TypeError = 7;
|
218
|
+
MissingData = 8;
|
219
|
+
DataFormatError = 9;
|
220
|
+
InvalidData = 10;
|
221
|
+
RemoteDataError = 11;
|
222
|
+
CannotWriteExistingResource = 12;
|
223
|
+
ValueSerializationError = 13;
|
224
|
+
ValueDeserializationError = 14;
|
225
|
+
// The sender is trying to publish a module named `M`, but the sender's account already contains
|
226
|
+
// a module with this name.
|
227
|
+
DuplicateModuleName = 15;
|
228
|
+
}
|
229
|
+
|
230
|
+
// user-defined assertion error code number
|
231
|
+
message AssertionFailure {
|
232
|
+
uint64 assertion_error_code = 1;
|
233
|
+
}
|
234
|
+
|
235
|
+
message ArithmeticError {
|
236
|
+
enum ArithmeticErrorType {
|
237
|
+
UnknownArithmeticError = 0;
|
238
|
+
Underflow = 1;
|
239
|
+
Overflow = 2;
|
240
|
+
DivisionByZero = 3;
|
241
|
+
// Fill with more later
|
242
|
+
}
|
243
|
+
ArithmeticErrorType error_code = 1;
|
244
|
+
}
|
245
|
+
|
246
|
+
message DynamicReferenceError {
|
247
|
+
enum DynamicReferenceErrorType {
|
248
|
+
UnknownDynamicReferenceError = 0;
|
249
|
+
MoveOfBorrowedResource = 1;
|
250
|
+
GlobalRefAlreadyReleased = 2;
|
251
|
+
MissingReleaseRef = 3;
|
252
|
+
GlobalAlreadyBorrowed = 4;
|
253
|
+
// Fill with with more later
|
254
|
+
}
|
255
|
+
DynamicReferenceErrorType error_code = 1;
|
256
|
+
}
|
257
|
+
|
258
|
+
message ExecutionStatus {
|
259
|
+
oneof execution_status {
|
260
|
+
RuntimeStatus runtime_status = 1;
|
261
|
+
AssertionFailure assertion_failure = 2;
|
262
|
+
ArithmeticError arithmetic_error = 3;
|
263
|
+
DynamicReferenceError reference_error = 4;
|
264
|
+
}
|
265
|
+
}
|
266
|
+
|
267
|
+
// The status of the VM
|
268
|
+
message VMStatus {
|
269
|
+
oneof error_type {
|
270
|
+
VMValidationStatus validation = 1;
|
271
|
+
VMVerificationStatusList verification = 2;
|
272
|
+
VMInvariantViolationError invariant_violation = 3;
|
273
|
+
BinaryError deserialization = 4;
|
274
|
+
ExecutionStatus execution = 5;
|
275
|
+
}
|
276
|
+
}
|