From 615649d6903df77146e1457b88be49fd9e95ae32 Mon Sep 17 00:00:00 2001 From: Sergey Bushnyak Date: Tue, 2 Feb 2021 19:03:13 +0200 Subject: [PATCH 1/4] convert 109 to md --- assets/109_1.png | Bin 0 -> 47260 bytes fatips/109.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 assets/109_1.png create mode 100644 fatips/109.md diff --git a/assets/109_1.png b/assets/109_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d48d94f63150e0e4da5a77531dc20a6c71b45509 GIT binary patch literal 47260 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 | 2020-02-02 | + +# Stateful Contracts + +## Summary +FATIP-109 introduces the characteristic of “state” to FAT smart contracts, which enables stateful composition to in-contract storage. FATIP-109 accomplishes this by using the FATIP-107 defined specialized format for storing and offloading data of arbitrary size on the Factom Blockchain through sequences of connected data blocks to allow specialized contracts for storing data. To be stateful means that some amount of storage on the chain is used to store values. This storage can be either global or local. Local storage refers to storing values in an account balance record if that account participates in the contract. Global storage is data that is specifically stored on the blockchain for the contract globally. + +## Motivation + +Stateless smart contracts are used to approve or reject spending or asset transfer transactions and often govern all transactions from a specific account. These types of contracts are already available as part of the FAT ecosystem. +FATIP-109 further enables the FAT ecosystem to support stateful smart contracts that hold application logic and can store and update on-chain values. +The capabilities available through the use of stateful contracts or the combination of stateful and stateless contracts significantly extend the range of decentralized application (dApp) functionalities possible on FAT and will allow developers to combine application logic and user state with the on-chain handling of tokens or various other on-chain assets. The following is a short survey of use case examples possible with adding stateful contracts to the FAT ecosystem: +A global value required before approving escrow payments +Example, a tracking dApp storing location on the blockchain +Dates or specific rounds specified to restrict transaction times +Example, a voting dApp storing results on-chain +Asset or balance information from the ledger required to approve transactions +Example, a trading dApp requiring a specific token to participate +A requirement for filling orders fully or partially +Example, a digital exchange dApp +Stateful smart contracts fundamentally function as state-holding entities. They store on-chain values for the contract globally or for individual accounts that have opted into the smart contract. +These contracts live on the blockchain and can be initiated by anyone. They are callable by users with stateful smart contract transactions. These transactions initiate the logic stored in the stateful smart contract. + +## Specification + +Stateful smart contracts have specific global values and per-user values. They control the logic of how these values are modified. +Stateful smart contracts are implemented with two exposed interface calls: +`call()` function is responsible for processing all application calls to the contract, with the exception of the `close`call. This addition is responsible for implementing the majority of application logic. Like stateless contracts, this program will succeed only if one nonzero value is left on the WASM stack upon completion. +`update()` function is used to handle internal operations and uses a `close`call to detach the smart contract from its address. This program will pass or fail the same way the `call()` does. In either function, if a global or local state variable is modified and the program fails, the state changes will not be applied. +Stateful smart contracts can create, update, and delete values in the global or local state. The number of values that can be written is limited based on how the contract was initially created. The state is represented in a key-value pair. The key and value are limited to 64 bytes of storage each for both global and local storage. These values are stored as byte slices and WASM opcodes provide read/write functionality. +FATIP-109 identifies standard internal calls. Calls to stateful smart contracts are implemented using `call()` actions. These transactions types are as follows: +`exec()` - generic application calls to execute the `call()` +`nullify()` - call to delete the application +`update()`- call to update contract +`close()` - call function can fail based on the WASM opcodes logic, to freeze contract and stop accepting other calls + +### Writing State + +During smart contract creation, a user needs to identify a set of key-value pairs that need to be tracked, setup the “fds” key reserved to link EntryChainId that is used for large storage and requires separate access, and uses a FATIP-107 Data Store to store contract global states. +Collection of global key-value pairs will store required data on-chain and available only by the contract creator for change, which will add updated key/value data to the end of the sequence. +Metadata structure +``` +{ + "data-store": "1.0", + "size": 999, + "fds": "4da6c4ba7c9f3d01a52df43ae5d67d7d8b3909babf6817463b8ceff3c74065ee", + "metadata": { + "gstate": + [ "key-1":"value1", + .. + "key-N":"valueN" + .. + "key-M":"valueM" + ] + } + } +} +``` +Collection of local key-value pairs will store required data in an attached key-value database and available values will be distributed through the synchronization process and change their state during execution on the particular node. + +### Reading State + +This is a read-only operation and does not allow one smart contract to modify the local/global state of another smart contract. Additionally, referenced addresses can be changed per smart contract call (transaction). + +####Local State +Local storage values are stored in the address balance record. Any address that sends a transaction to the smart contract can have its local storage modified by the smart contract as long as the address has been listed in the smart contract. +Any call to the smart contract is able to reference additional addresses which can also have their local storage manipulated for the current smart contract. These addresses which specify the application identity of the smart contract can read local values. A contract’s creator should explicitly list those addresses that are allowed read capability. + +### Global State +Global storage for the current contract can also be modified by the smart contract code. The global storage can list additional contracts able to be read. +Each internal call accepts execution requests only from the contract owner and listed smart contracts: + +Examples: +``` +func distribute (arg: int) { + var readGlobal = get(FA…, varName) + var newVal = readGlobal + arg + update(FA…, varName, newVal) + // tx logic +} +func main() { + // Call stateful contract from another and do something + If ( distributionDate >= currentDate) + call(FA.., distribute, 1000) // call function `distribute` in reward distribution contract, and assign parameter + else + // do something else +} +``` + +Stateful Contract Lifecycle Diagram: + +![img1](/assets/109_1.png) + +## Implementation +WASM-metering The metering counts computation time for a given program in units of gas. +FAASM a high-performance stateful serverless runtime. + +## Copyright +Copyright and related rights waived via CC0. From 0bc519fb1ecdc09c1ba170d7a80a3d206bf247c9 Mon Sep 17 00:00:00 2001 From: Sergey Bushnyak Date: Tue, 2 Feb 2021 19:20:34 +0200 Subject: [PATCH 2/4] fix formatting --- fatips/109.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/fatips/109.md b/fatips/109.md index 46c72c6..302cc87 100644 --- a/fatips/109.md +++ b/fatips/109.md @@ -10,16 +10,16 @@ FATIP-109 introduces the characteristic of “state” to FAT smart contracts, w ## Motivation Stateless smart contracts are used to approve or reject spending or asset transfer transactions and often govern all transactions from a specific account. These types of contracts are already available as part of the FAT ecosystem. + FATIP-109 further enables the FAT ecosystem to support stateful smart contracts that hold application logic and can store and update on-chain values. + The capabilities available through the use of stateful contracts or the combination of stateful and stateless contracts significantly extend the range of decentralized application (dApp) functionalities possible on FAT and will allow developers to combine application logic and user state with the on-chain handling of tokens or various other on-chain assets. The following is a short survey of use case examples possible with adding stateful contracts to the FAT ecosystem: -A global value required before approving escrow payments -Example, a tracking dApp storing location on the blockchain -Dates or specific rounds specified to restrict transaction times -Example, a voting dApp storing results on-chain -Asset or balance information from the ledger required to approve transactions -Example, a trading dApp requiring a specific token to participate -A requirement for filling orders fully or partially -Example, a digital exchange dApp + +- A global value required before approving escrow payments. Example, a tracking dApp storing location on the blockchain +- Dates or specific rounds specified to restrict transaction times. Example, a voting dApp storing results on-chain +- Asset or balance information from the ledger required to approve transactions. Example, a trading dApp requiring a specific token to participate +- A requirement for filling orders fully or partially. Example, a digital exchange dApp + Stateful smart contracts fundamentally function as state-holding entities. They store on-chain values for the contract globally or for individual accounts that have opted into the smart contract. These contracts live on the blockchain and can be initiated by anyone. They are callable by users with stateful smart contract transactions. These transactions initiate the logic stored in the stateful smart contract. @@ -27,20 +27,24 @@ These contracts live on the blockchain and can be initiated by anyone. They are Stateful smart contracts have specific global values and per-user values. They control the logic of how these values are modified. Stateful smart contracts are implemented with two exposed interface calls: -`call()` function is responsible for processing all application calls to the contract, with the exception of the `close`call. This addition is responsible for implementing the majority of application logic. Like stateless contracts, this program will succeed only if one nonzero value is left on the WASM stack upon completion. -`update()` function is used to handle internal operations and uses a `close`call to detach the smart contract from its address. This program will pass or fail the same way the `call()` does. In either function, if a global or local state variable is modified and the program fails, the state changes will not be applied. +- `call()` function is responsible for processing all application calls to the contract, with the exception of the `close`call. This addition is responsible for implementing the majority of application logic. Like stateless contracts, this program will succeed only if one nonzero value is left on the WASM stack upon completion. +- `update()` function is used to handle internal operations and uses a `close`call to detach the smart contract from its address. This program will pass or fail the same way the `call()` does. In either function, if a global or local state variable is modified and the program fails, the state changes will not be applied. Stateful smart contracts can create, update, and delete values in the global or local state. The number of values that can be written is limited based on how the contract was initially created. The state is represented in a key-value pair. The key and value are limited to 64 bytes of storage each for both global and local storage. These values are stored as byte slices and WASM opcodes provide read/write functionality. + FATIP-109 identifies standard internal calls. Calls to stateful smart contracts are implemented using `call()` actions. These transactions types are as follows: -`exec()` - generic application calls to execute the `call()` -`nullify()` - call to delete the application -`update()`- call to update contract -`close()` - call function can fail based on the WASM opcodes logic, to freeze contract and stop accepting other calls +- `exec()` - generic application calls to execute the `call()` +- `nullify()` - call to delete the application +- `update()`- call to update contract +- `close()` - call function can fail based on the WASM opcodes logic, to freeze contract and stop accepting other calls ### Writing State During smart contract creation, a user needs to identify a set of key-value pairs that need to be tracked, setup the “fds” key reserved to link EntryChainId that is used for large storage and requires separate access, and uses a FATIP-107 Data Store to store contract global states. + Collection of global key-value pairs will store required data on-chain and available only by the contract creator for change, which will add updated key/value data to the end of the sequence. + Metadata structure + ``` { "data-store": "1.0", From 13912378cd812594e622dbd45ff869f6cda7b92a Mon Sep 17 00:00:00 2001 From: Sergey Bushnyak Date: Tue, 2 Feb 2021 19:22:38 +0200 Subject: [PATCH 3/4] fix formatting --- fatips/109.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fatips/109.md b/fatips/109.md index 302cc87..0f0cd46 100644 --- a/fatips/109.md +++ b/fatips/109.md @@ -68,15 +68,16 @@ Collection of local key-value pairs will store required data in an attached key- This is a read-only operation and does not allow one smart contract to modify the local/global state of another smart contract. Additionally, referenced addresses can be changed per smart contract call (transaction). -####Local State +#### Local State Local storage values are stored in the address balance record. Any address that sends a transaction to the smart contract can have its local storage modified by the smart contract as long as the address has been listed in the smart contract. Any call to the smart contract is able to reference additional addresses which can also have their local storage manipulated for the current smart contract. These addresses which specify the application identity of the smart contract can read local values. A contract’s creator should explicitly list those addresses that are allowed read capability. -### Global State +#### Global State Global storage for the current contract can also be modified by the smart contract code. The global storage can list additional contracts able to be read. Each internal call accepts execution requests only from the contract owner and listed smart contracts: Examples: + ``` func distribute (arg: int) { var readGlobal = get(FA…, varName) From 46a4d249958040055d1117d135050a9f40584fda Mon Sep 17 00:00:00 2001 From: Sergey Bushnyak Date: Tue, 2 Feb 2021 19:24:13 +0200 Subject: [PATCH 4/4] fix formatting --- fatips/109.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fatips/109.md b/fatips/109.md index 0f0cd46..7e0f678 100644 --- a/fatips/109.md +++ b/fatips/109.md @@ -82,15 +82,16 @@ Examples: func distribute (arg: int) { var readGlobal = get(FA…, varName) var newVal = readGlobal + arg - update(FA…, varName, newVal) + update(FA…, varName, newVal) // tx logic } func main() { - // Call stateful contract from another and do something - If ( distributionDate >= currentDate) - call(FA.., distribute, 1000) // call function `distribute` in reward distribution contract, and assign parameter + // Call stateful contract from another and do something + if ( distributionDate >= currentDate) + // call function `distribute` in reward distribution contract, and assign parameter + call(FA.., distribute, 1000) else - // do something else + // do something else } ```