예제 #1
0
 public Block(ChainIdentifier chainIdentifier, Data data, Hash previousHash)
 {
     ChainIdentifier = chainIdentifier;
     Timestamp       = Timestamp.UtcNow;
     Data            = data;
     PreviousHash    = previousHash;
     Hash            = new Hash(PreviousHash, Timestamp, Data);
 }
예제 #2
0
 public Block(ChainIdentifier chainIdentifier, Timestamp timestamp, Data data, Hash previousHash, Hash hash)
 {
     ChainIdentifier = chainIdentifier;
     Timestamp       = timestamp;
     Data            = data;
     PreviousHash    = previousHash;
     Hash            = hash;
 }
예제 #3
0
 public Block(Data data)
 {
     ChainIdentifier = new ChainIdentifier();
     Timestamp       = Timestamp.UtcNow;
     Data            = data;
     PreviousHash    = Hash.FirstHash;
     Hash            = new Hash(PreviousHash, Timestamp, Data);
 }
        public Task <Chain> Get(ChainIdentifier id)
        {
            var blocksFromChain = _blocks.Where(b => b.ChainIdentifier.Equals(id)).ToList();
            var orderedBlocks   = (from block in blocksFromChain orderby block.Timestamp select block).ToList();

            var chain = new Chain(orderedBlocks.First().ChainIdentifier, orderedBlocks);

            return(Task.FromResult(chain));
        }
예제 #5
0
        public async Task AddToChain(ChainIdentifier chainIdentifier, Data data)
        {
            var chain = await _chainRepository.Get(chainIdentifier);

            var lastHastOfTheChain = chain.LastOrDefault.Hash;

            var block = new Block(chainIdentifier, data, lastHastOfTheChain);

            await _blockRepository.Add(block);
        }
예제 #6
0
        public static bool ValidateChainUidAgainst(this string uid, GenerationEnvironment env)
        {
            if (!ChainIdentifier.TryParse(uid, env.errorContext, out var parsed))
            {
                return(false);
            }

            if (env.exportingClasses.TryGetValue(parsed.Class, out var exportingType))
            {
                switch (parsed.Type)
                {
                case ChainContributionType.More:
                case ChainContributionType.Global:
                    return(TrueOr(
                               exportingType.contributedChains.Any(chain => chain.Name == parsed.Chain &&
                                                                   chain.ContributionType == parsed.Type),
                               () => env.ReportError($"{uid} references a non-existent chain: {parsed.Chain}.")));

                case ChainContributionType.Instance:
                    if (exportingType is BehaviorSymbolWrapper behavior)
                    {
                        if (behavior.Chains.Any(chain => chain.Name == parsed.Chain))
                        {
                            return(true);
                        }
                        env.ReportError($"{uid} references a non-existent behavior chain: {parsed.Chain}.");
                    }
                    else
                    {
                        env.ReportError($"{uid} referenced an exporting class that was not a behavior: {parsed.Class}. If you meant a static class, use '+{uid}' instead.");
                    }
                    return(false);

                default:
                    return(false);
                }
            }
            else
            {
                env.ReportError($"{uid} references a non-existent exporting class: {parsed.Class}");
            }
            return(false);
        }
예제 #7
0
            public static bool TryParse(string uid, ErrorContext ctx, out ChainIdentifier parsed)
            {
                var strippedUid = uid;
                var type        = StripContributionType(ref strippedUid);
                var split       = strippedUid.Split('.');

                if (split.Length != 2)
                {
                    ctx.Report($"{uid} had wrong format. Expecting format [+]<ExportingClassName>.<ChainName>");
                    parsed = default;
                    return(false);
                }

                parsed = new ChainIdentifier
                {
                    Type  = type,
                    Class = split[0],
                    Chain = split[1]
                };
                return(true);
            }