Multiprocess
Multiprocessing Manager
Multiprocessing is a powerful package enabling developers to manually spawn EVM instances for parallel processing, allows the programmer to fully leverage the computation power of modern multiple processor design. It effectively overcomes the limitations of the single-threaded design in EVM.
Contract
The Multiprocess
offers a queue, which temporarily holds a list of tasks before execution begins. State consistency is rigorously guaranteed all the time.
Constructor
constructor (uint256 threads)
Constructor to initialize the Multiprocess container.
Parameters:
processes
: The number of parallel proceses(ranging from 1 to 255) for parallel processing.
Public Functions
push
Push an executable message into the container with specified gas limit, contract address, and function call data.
Parameters:
gaslimit
: The gas limit for the execution of the function call.contractAddr
: The address of the smart contract to execute the function on.funcCall
: The encoded function call data.
push
Push an executable message into the container with specified gas limit, eth value, contract address, and function call data.
Parameters:
gaslimit
: The gas limit for the execution of the function call.ethVal
: The number of wei sent with the message.contractAddr
: The address of the smart contract to execute the function on.funcCall
: The encoded function call data.
pop
Pop an executable message from the container.
Returns:
bytes
: The popped executable message.
get
Get an executable message from the container at the specified index.
Parameters:
idx
: The index of the executable message to retrieve.
Returns:
bytes
: The executable message at the specified index.
set
Set an executable message at the specified index in the container.
Parameters:
idx
: The index where the executable message should be stored.elem
: The executable message data to be stored at the specified index.
run
This function processes the executable messages concurrently with the number of threads specified in the constructor.
Note: Executions causing potential state inconsistency will be reverted automatically. This is guaranteed at the system level.
Example 1
The contract ParaNativeAssignmentTest
contains a function call()
that utilizes the Multiprocess
contract to execute the function assigner()
in parallel. The assigner()
function takes an input v
and assigns the value v + 10
to the element at index v
in the results
array.Here's a step-by-step explanation of what happens:
The
call()
function is called, and it creates a new instance of theMultiprocess
contract with 2 threads (processes).Two messages are pushed into the
Multiprocess
container with the function signature "assigner(uint256)" and respective values0
and1
.The
mp.run()
function is called, which executes the two messages in parallel using the specified number of threads (2).
Analysis
The final result of results[0]
will be 10
, and the final result of results[1]
will be 11
. This is because the assigner()
function is executed twice, once with v
as 0
, which assigns 0 + 10 = 10
to results[0]
, and once with v
as 1
, which assigns 1 + 10 = 11
to results[1]
Example 2
The NativeStorageAssignmentTest
contract demonstrates how to use the Multiprocess
contract to execute multiple tasks concurrently on a shared instance of the NativeStorage
contract, allowing for efficient parallel processing. The end result of calling the call()
function should be that results.getX()
returns 2 and results.getY()
returns 102.
Example 3
This example illustrates how the system manages scenarios in which multiple threads attempt to update a shared variable. Without proper handling, this could lead to data consistency problems.
The third example is quite similar to the previous example. They both use the NativeStorage
contract and the Arcology's concurrency framework to perform parallel execution of tasks. The only difference is that this example calls the incrementX()
twice in parallel.
The incrementX()
function inside the NativeStorage
contract increases the value of the x
variable by 1.
Since the two instances of NativeStorageAssignmentTest
are running in parallel, they both attempt to modify the x and Y
variable simultaneously. Arcology's concurrency framework detects the conflict. Only one of the modifications will succeed, and the other one will fail.
Analysis
After both calls to incrementX()
are executed in parallel, the value of x
will increase by 1, not 2. This is because one of the incrementX()
calls and one of the calls succeeded, while the other one was automatically reverted by the system due to conflict.
The concurrency control system consistently monitors state accesses that could potentially cause conflicts and automatically reverts the associated transactions.
Example 4
The SubcurrencyCaller
contract utilizes Arcology's Multiprocess
library to perform parallel processing of multiple minting transactions on the Subcurrency
contract, greatly improving the overall efficiency.
Note: The example highlights the main features and applications of Arcology's multiprocessing capability. It demonstrates how Arcology's technology can enhance the execution of smart contracts and provide significant benefits in terms of scalability and efficiency.
Code Analysis
Parallel Minting Transactions: In the
call
function of theSubcurrencyCaller
contract, four minting transactions are added to theMultiprocess
queue. These transactions are designed to mint tokens for four different addresses: Alice, Bob, Carol, and Dave.Execution and Verification: After adding the minting transactions to the
Multiprocess
queue usingmp.push()
, the contract checks if the number of transactions in the queue is equal to 4 by usingmp.length()
. This ensures that all four minting transactions have been successfully added to the queue.Parallel Execution: The
mp.run()
function is then called, which executes all the minting transactions in parallel. Arcology's parallel processing capability allows these transactions to be processed simultaneously, reducing the overall execution time and gas cost.Verification of Minted Balances: After the parallel execution, the contract verifies the balances of the four addresses by calling the
getter
function of theSubcurrency
contract. This demonstrates that the transactions were executed correctly, and the minted amounts were applied to the corresponding addresses.
Conclusion
Arcology ensures data consistency and integrity when concurrent operations are performed on shared state variables, allowing developers to harness the power of parallel execution without worrying about data corruption or conflicts.
Last updated