From 9bb90647f9fc820d7fc16921cdc31f39f15a8e25 Mon Sep 17 00:00:00 2001 From: moreal Date: Fri, 4 Aug 2023 13:11:27 +0900 Subject: [PATCH] fix(action-evaluator-common-components): link action evaluation states --- .../AccountStateDelta.cs | 35 ++++++++++++++----- .../RemoteActionEvaluator.cs | 17 +++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/.Libplanet.Extensions.ActionEvaluatorCommonComponents/AccountStateDelta.cs b/.Libplanet.Extensions.ActionEvaluatorCommonComponents/AccountStateDelta.cs index 8a37cb91d6..931e5f02a6 100644 --- a/.Libplanet.Extensions.ActionEvaluatorCommonComponents/AccountStateDelta.cs +++ b/.Libplanet.Extensions.ActionEvaluatorCommonComponents/AccountStateDelta.cs @@ -18,6 +18,8 @@ public class AccountStateDelta : IAccountStateDelta private ValidatorSet? _validatorSet; private IAccountDelta _delta; + public IAccountState BaseState { get; set; } + public IImmutableSet
UpdatedAddresses => _delta.UpdatedAddresses; public IImmutableSet
StateUpdatedAddresses => _delta.StateUpdatedAddresses; @@ -121,7 +123,7 @@ public AccountStateDelta(byte[] bytes) public IValue? GetState(Address address) => _states.ContainsKey(address) ? _states[address] - : throw new NotSupportedException(); + : BaseState.GetState(address); public IReadOnlyList GetStates(IReadOnlyList
addresses) => addresses.Select(GetState).ToArray(); @@ -132,7 +134,7 @@ public FungibleAssetValue GetBalance(Address address, Currency currency) { if (!_fungibles.TryGetValue((address, currency), out BigInteger rawValue)) { - throw new NotSupportedException(); + return BaseState.GetBalance(address, currency); } return FungibleAssetValue.FromRawValue(currency, rawValue); @@ -155,7 +157,7 @@ public FungibleAssetValue GetTotalSupply(Currency currency) return FungibleAssetValue.FromRawValue(currency, totalSupplyValue); } - throw new NotSupportedException(); + return BaseState.GetTotalSupply(currency); } public IAccountStateDelta MintAsset( @@ -192,7 +194,10 @@ public IAccountStateDelta MintAsset( ), _totalSupplies.SetItem(currency, (currentTotalSupply + value).RawValue), _validatorSet - ); + ) + { + BaseState = BaseState, + }; } return new AccountStateDelta( @@ -203,7 +208,10 @@ public IAccountStateDelta MintAsset( ), _totalSupplies, _validatorSet - ); + ) + { + BaseState = BaseState, + }; } public IAccountStateDelta TransferAsset( @@ -234,7 +242,10 @@ public IAccountStateDelta TransferAsset( var balances = _fungibles .SetItem((sender, currency), senderRemains.RawValue) .SetItem((recipient, currency), recipientRemains.RawValue); - return new AccountStateDelta(_states, balances, _totalSupplies, _validatorSet); + return new AccountStateDelta(_states, balances, _totalSupplies, _validatorSet) + { + BaseState = BaseState, + }; } public IAccountStateDelta BurnAsset( @@ -273,12 +284,15 @@ public IAccountStateDelta BurnAsset( (GetTotalSupply(currency) - value).RawValue) : _totalSupplies, _validatorSet - ); + ) + { + BaseState = BaseState, + }; } public ValidatorSet GetValidatorSet() { - return _validatorSet ?? throw new NotSupportedException(); + return _validatorSet ?? BaseState.GetValidatorSet(); } public IAccountStateDelta SetValidator(Validator validator) @@ -288,6 +302,9 @@ public IAccountStateDelta SetValidator(Validator validator) _fungibles, _totalSupplies, GetValidatorSet().Update(validator) - ); + ) + { + BaseState = BaseState, + }; } } diff --git a/.Libplanet.Extensions.RemoteActionEvaluator/RemoteActionEvaluator.cs b/.Libplanet.Extensions.RemoteActionEvaluator/RemoteActionEvaluator.cs index 4fd8a38716..819011c445 100644 --- a/.Libplanet.Extensions.RemoteActionEvaluator/RemoteActionEvaluator.cs +++ b/.Libplanet.Extensions.RemoteActionEvaluator/RemoteActionEvaluator.cs @@ -39,6 +39,23 @@ public IReadOnlyList Evaluate(IPreEvaluationBlock block) var actionEvaluations = evaluationResponse.Evaluations.Select(ActionEvaluationMarshaller.Deserialize) .ToImmutableList(); + for (var i = 0; i < actionEvaluations.Count; ++i) + { + if (i > 0) + { + actionEvaluations[i].InputContext.PreviousState.BaseState = + actionEvaluations[i - 1].OutputState; + } + else + { + actionEvaluations[i].InputContext.PreviousState.BaseState = + _blockChainStates.GetBlockState(block.PreviousHash); + } + + actionEvaluations[i].OutputState.BaseState = + actionEvaluations[i].InputContext.PreviousState; + } + return actionEvaluations; }