# Lesson 03 - Smart Contracts with the Scilla Language Part 2
Mainly Data Types
## Review (Q&A)
1. What’s the difference between the accepted and success keys in the receipt object?
> Accepted: When "accept" function was called.
> Success: When money is successfully transferred from one account to the other.
2. Why is the network limited to ~2800 transactions per second?
> 2400 nodes / 600 nodes/shard = 4 shards.
To increase the number of nodes / shards, need more experiments to ensure security. Given the current number of transactions, there's no urgent need to increase the number of nodes.
## Quiz
1. The Scilla programming language is Turing-complete: False. It's not Turing-complete by design (less powerful than other languages in the blockchain world) -> prevents infinite-looping applications
2. Which of these values are not an implicit variable in a contract (including transitions)?
a. _this :heavy_check_mark: (In Scilla there's no such thing as _this)
b. _address
c. _balance
d. _amount
3. Which statement is false?
a. Transitions are invoked by messages.
b. Transitions have implicit parameters _sender and _amount
c. Procedures do not return a value to the caller.
d. Transition arguments are optional :heavy_check_mark: (Transition arguments are mandatory)
4. Which operator fetches the value of a contract field and stores it in a local variable?
<- Reading from mutable :heavy_check_mark:
<-& Reading from immutable (must dereference)
:= to store states on the blockchain (changing / mutating contract states) (write to contract)
= is for expressions (for defining things)
<= is to assign one variable from memory to another variable in memory (write to local)
5. Which of the following is not a form of communication in Scilla?
a. ErrorMessages :heavy_check_mark: (doesn't exist in Scilla)
b. messages
c. events
d. exceptions
## 3.1 Working with integers and strings
### Integers
* can be signed / unsigned with sizes of 32, 64, 128, 256 bits
* Implicit variables _amount and _balance are Uint128 (recap: passed to every transition calls)
* Buffer underflow/overflow (overflow: return zero after max positive number. this is not allowed), division by zero errors. These 2 will return runtime exceptions. (recap: we can throw error but cannot handle error)

### Strings
* No hard limit on length, but likely enforced by network (i.e. just that the requests will timeout)
* Support operations such as eq, concat, substr, strlen, etc.
* Only the substr fails with an error, with invalid params.

## 3.2 Byte strings, addresses and block numbers
### Byte Strings
* A ByStr32 represents a 32-byte hash (64hex chars)
* A ByStr32 literal is prefixed with 0x
* sha256hash, keccak256hash, ripemd160hash (20 bytes)
### Addresses
* Correspond to wallets and contracts
* Addresses are of type ByStr20 (40 hex chars)
* Often used in identity or ownership concerns

### Block Numbers
* Uses dedicated type BNum
* Represents identifiers of blocks being mined (unique to each block)
* Often used as stand-in for time values (goes back to the fact that blockchain implementation has to be deterministic, cannot be based on actual time, since value becomes different over time)

### Assignment 3A
## 3.3 Working with maps
* Maps are key value stores, and can be nested
* keys can be of types: String, IntX, UintX, ByStrX
* Values can be of any type except functions
* Emp: empty map

## 3.4 Booleans and options
> monad, monoid
* Boolean is an Algebraic Data Type (ADT), specified as Bool.
* ADTs are composite type in functional programming.
* Has two constructors, True and False, which take no args. (Constructors here are not exactly the same as how constructors are usually defined in other languages)
* | is called monads / predicates. can only be 2 of this in each match (in the case of booleans)
### Options
* Optional values are specified using the type Option t
* The Some constructor represents the presence of value
* The None constructor represents the non-existence of value
## 3.5 Lists and pairs
* Defined as List t, and it has 2 constructors: Nil & Cons
* Nil represents an empty list and takes no arguments
* Cons constructs a list, from a value and an existing list
* Cons adds elements to the front of the list (one element at a time)
* All elements in a list must be of type t
* Traversal via list_foldl, list_foldr, list_foldk
* `in` is to terminate expressions in the library
### Pairs
* Specified as Pair t1 t2, represents a pair of values
* Only has one constructor, Pair, takes 2 args of types t1, t2
* t1 and t2 need not be of the same type
* fst: polymotic function (need to pass the different types that return a function that return those different types, similar to currying)
## 3.6 Standard libraries
| Utils | Keywords |
| --------- | ----------------------------------------------------------------------------------- |
| BoolUtils | andb, orb, negb, bool_to_string |
| IntUtils | intX_eq, uintX_eq, intX_lt, uintX_lt, intX_neq, uintX_neq, intX_le, uintX_le, etc |
| ListUtils | list_map, list_filter, list_length, list_eq, list_exists, list_sort, list_find, etc |
| NatUtils | nat_prev, nat_eq, nat_to_int, etc |
| PairUtils | fst,snd |