Skip to content

Commit

Permalink
[RSC-246] Transfer new period payload in chunks
Browse files Browse the repository at this point in the history
  • Loading branch information
gromakovsky committed Sep 20, 2016
1 parent d0975f0 commit 2867ebc
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 7 deletions.
1 change: 1 addition & 0 deletions rscoin-core.cabal
Expand Up @@ -81,6 +81,7 @@ library
, safecopy
, serokell-core
, scientific
, split
, stm >= 2.4.4
, template-haskell
, text >= 1.2.2.0
Expand Down
76 changes: 69 additions & 7 deletions src/RSCoin/Core/Communication.hs
Expand Up @@ -77,6 +77,8 @@ import Control.Monad.Catch (MonadThrow (throwM), catch)
import Control.Monad.Extra (unlessM)
import Control.Monad.Trans (MonadIO, liftIO)
import Data.Binary (Binary)
import qualified Data.HashMap.Strict as HM
import Data.List.Split (chunksOf)
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
import Data.MessagePack (MessagePack)
Expand Down Expand Up @@ -104,16 +106,16 @@ import RSCoin.Core.NodeConfig (WithNodeContext (getNodeContext),
bankPublicKey, isTestRun, notaryPublicKey)
import RSCoin.Core.Primitives (AddrId, Address, Transaction, TransactionId)
import qualified RSCoin.Core.Protocol as P
import RSCoin.Core.Strategy (AllocationAddress, AllocationInfo,
AllocationStrategy, MSAddress, PartyAddress,
TxStrategy)
import RSCoin.Core.Strategy (AddressToTxStrategyMap, AllocationAddress,
AllocationInfo, AllocationStrategy,
MSAddress, PartyAddress, TxStrategy)
import RSCoin.Core.Transaction (TxVerdict (..), validateTxPure)
import RSCoin.Core.Types (ActionLog, CheckConfirmation,
CheckConfirmations, CommitAcknowledgment,
Explorer (..), Explorers, HBlock,
HBlockMetadata, LBlock (..),
Mintette (mintetteHost, mintettePort),
MintetteId, Mintettes, NewPeriodData,
MintetteId, Mintettes, NewPeriodData (..),
PeriodId, PeriodResult, Utxo, WithMetadata,
WithSignature (..), mkWithSignature,
verifyWithSignature)
Expand Down Expand Up @@ -311,20 +313,80 @@ addMintetteUsingPermission mintetteSK mintette = do
callMintette :: (WorkMode m, MessagePack a) => Mintette -> P.Client a -> m a
callMintette m = handleErrors . P.callMintetteSafe m

splitNewPeriodData :: NewPeriodData -> (NewPeriodData, [Utxo], [AddressToTxStrategyMap])
splitNewPeriodData npd@NewPeriodData {npdNewIdPayload = Nothing, ..} = (npd, mempty, mempty)
splitNewPeriodData NewPeriodData { npdNewIdPayload = Just (mintetteId, utxo, addresses)
, ..
} =
let utxos = splitUtxo utxo
addressesMaps = splitAddresses addresses
in ( NewPeriodData
{ npdNewIdPayload = Just (mintetteId, head utxos, head addressesMaps)
, ..
}
, tail utxos
, tail addressesMaps)

splitUtxo :: Utxo -> [Utxo]
splitUtxo utxo
| HM.size utxo <= limit = [utxo]
| otherwise = map HM.fromList . chunksOf limit . HM.toList $ utxo
where
limit = 100

splitAddresses :: AddressToTxStrategyMap -> [AddressToTxStrategyMap]
splitAddresses addresses
| M.size addresses <= limit = [addresses]
| otherwise = map M.fromList . chunksOf limit . M.toList $ addresses
where
limit = 100

announceNewPeriod
:: WorkMode m
=> Mintette -> SecretKey -> NewPeriodData -> m ()
announceNewPeriod mintette bankSK npd = do
L.logDebug $
sformat
("Announce new period to mintette " % build % ", new period data " %
("Announcing new period to mintette " % build % ", new period data " %
build)
mintette
npd
let signed = mkWithSignature bankSK npd
handleEither $
let (npdSmall, utxos, addresses) = splitNewPeriodData npd
let signed = mkWithSignature bankSK npdSmall
() <-
handleEither $
callMintette mintette $
P.call (P.RSCMintette P.AnnounceNewPeriod) signed
mapM_ (announceExtraUtxo mintette bankSK) utxos
mapM_ (announceExtraAddresses mintette bankSK) addresses

announceExtraUtxo
:: WorkMode m
=> Mintette -> SecretKey -> Utxo -> m ()
announceExtraUtxo mintette bankSK utxo = do
L.logDebug $
sformat
("Announcing extra utxo to mintette " % build % ": " % build)
mintette
utxo
let signed = mkWithSignature bankSK utxo
handleEither $
callMintette mintette $
P.call (P.RSCMintette P.AnnounceExtraUtxo) signed

announceExtraAddresses
:: WorkMode m
=> Mintette -> SecretKey -> AddressToTxStrategyMap -> m ()
announceExtraAddresses mintette bankSK addresses = do
L.logDebug $
sformat
("Announcing extra addresses to mintette " % build % ": " % build)
mintette
addresses
let signed = mkWithSignature bankSK addresses
handleEither $
callMintette mintette $
P.call (P.RSCMintette P.AnnounceExtraAddresses) signed

checkNotDoubleSpent
:: WorkMode m
Expand Down
2 changes: 2 additions & 0 deletions src/RSCoin/Core/Protocol/Types.hs
Expand Up @@ -76,6 +76,8 @@ data ExplorerMethod
data MintetteMethod
= PeriodFinished
| AnnounceNewPeriod
| AnnounceExtraUtxo
| AnnounceExtraAddresses
| CheckTx
| CheckTxBatch
| CommitTx
Expand Down

0 comments on commit 2867ebc

Please sign in to comment.