示例#1
0
        public static ContractParameter ToParameter(this StackItem item)
        {
            switch (item)
            {
            case VMArray array:
                return(new ContractParameter
                {
                    Type = ContractParameterType.Array,
                    Value = array.Select(p => p.ToParameter()).ToList()
                });

            case Map map:
                return(new ContractParameter
                {
                    Type = ContractParameterType.Map,
                    Value = map.Select(p => new KeyValuePair <ContractParameter, ContractParameter>(p.Key.ToParameter(), p.Value.ToParameter())).ToList()
                });

            case VMBoolean _:
                return(new ContractParameter
                {
                    Type = ContractParameterType.Boolean,
                    Value = item.GetBoolean()
                });

            case ByteArray _:
                return(new ContractParameter
                {
                    Type = ContractParameterType.ByteArray,
                    Value = item.GetByteArray()
                });

            case Integer _:
                return(new ContractParameter
                {
                    Type = ContractParameterType.Integer,
                    Value = item.GetBigInteger()
                });

            case InteropInterface _:
                return(new ContractParameter
                {
                    Type = ContractParameterType.InteropInterface
                });

            default:
                throw new ArgumentException();
            }
        }
示例#2
0
        public static ContractParameter ToParameter(this StackItem item)
        {
            TR.Enter();
            switch (item)
            {
            case VMArray array:
                return(TR.Exit(new ContractParameter
                {
                    Type = ContractParameterType.Array,
                    Value = array.Select(p => p.ToParameter()).ToArray()
                }));

            case VMBoolean _:
                return(TR.Exit(new ContractParameter
                {
                    Type = ContractParameterType.Boolean,
                    Value = item.GetBoolean()
                }));

            case ByteArray _:
                return(TR.Exit(new ContractParameter
                {
                    Type = ContractParameterType.ByteArray,
                    Value = item.GetByteArray()
                }));

            case Integer _:
                return(TR.Exit(new ContractParameter
                {
                    Type = ContractParameterType.Integer,
                    Value = item.GetBigInteger()
                }));

            case InteropInterface _:
                return(TR.Exit(new ContractParameter
                {
                    Type = ContractParameterType.InteropInterface
                }));

            default:
                TR.Exit();
                throw new ArgumentException();
            }
        }
示例#3
0
        public static ContractParameter ToParameter(this StackItem item)
        {
            switch (item.GetType().Name)
            {
            case "Array":
            case "Struct":
                return(new ContractParameter
                {
                    Type = ContractParameterType.Array,
                    Value = item.GetArray().Select(p => p.ToParameter()).ToArray()
                });

            case "Boolean":
                return(new ContractParameter
                {
                    Type = ContractParameterType.Boolean,
                    Value = item.GetBoolean()
                });

            case "ByteArray":
                return(new ContractParameter
                {
                    Type = ContractParameterType.ByteArray,
                    Value = item.GetByteArray()
                });

            case "Integer":
                return(new ContractParameter
                {
                    Type = ContractParameterType.Integer,
                    Value = item.GetBigInteger()
                });

            case "InteropInterface":
                return(new ContractParameter
                {
                    Type = ContractParameterType.InteropInterface
                });

            default:
                throw new ArgumentException();
            }
        }
示例#4
0
        private static ContractParameter ToParameter(StackItem item, List <Tuple <StackItem, ContractParameter> > context)
        {
            ContractParameter parameter = null;

            switch (item)
            {
            case VMArray array:
                if (context is null)
                {
                    context = new List <Tuple <StackItem, ContractParameter> >();
                }
                else
                {
                    parameter = context.FirstOrDefault(p => ReferenceEquals(p.Item1, item))?.Item2;
                }
                if (parameter is null)
                {
                    parameter = new ContractParameter {
                        Type = ContractParameterType.Array
                    };
                    context.Add(new Tuple <StackItem, ContractParameter>(item, parameter));
                    parameter.Value = array.Select(p => ToParameter(p, context)).ToList();
                }
                break;

            case Map map:
                if (context is null)
                {
                    context = new List <Tuple <StackItem, ContractParameter> >();
                }
                else
                {
                    parameter = context.FirstOrDefault(p => ReferenceEquals(p.Item1, item))?.Item2;
                }
                if (parameter is null)
                {
                    parameter = new ContractParameter {
                        Type = ContractParameterType.Map
                    };
                    context.Add(new Tuple <StackItem, ContractParameter>(item, parameter));
                    parameter.Value = map.Select(p => new KeyValuePair <ContractParameter, ContractParameter>(ToParameter(p.Key, context), ToParameter(p.Value, context))).ToList();
                }
                break;

            case VMBoolean _:
                parameter = new ContractParameter
                {
                    Type  = ContractParameterType.Boolean,
                    Value = item.GetBoolean()
                };
                break;

            case ByteArray _:
                parameter = new ContractParameter
                {
                    Type  = ContractParameterType.ByteArray,
                    Value = item.GetByteArray()
                };
                break;

            case Integer _:
                parameter = new ContractParameter
                {
                    Type  = ContractParameterType.Integer,
                    Value = item.GetBigInteger()
                };
                break;

            case InteropInterface _:
                parameter = new ContractParameter
                {
                    Type = ContractParameterType.InteropInterface
                };
                break;

            default:
                throw new ArgumentException();
            }
            return(parameter);
        }
        private void SerializeStackItem(StackItem item, BinaryWriter writer)
        {
            List <StackItem>  serialized   = new List <StackItem>();
            Stack <StackItem> unserialized = new Stack <StackItem>();

            unserialized.Push(item);
            while (unserialized.Count > 0)
            {
                item = unserialized.Pop();
                switch (item)
                {
                case ByteArray _:
                    writer.Write((byte)StackItemType.ByteArray);
                    writer.WriteVarBytes(item.GetByteArray());
                    break;

                case VMBoolean _:
                    writer.Write((byte)StackItemType.Boolean);
                    writer.Write(item.GetBoolean());
                    break;

                case Integer _:
                    writer.Write((byte)StackItemType.Integer);
                    writer.WriteVarBytes(item.GetByteArray());
                    break;

                case InteropInterface _:
                    throw new NotSupportedException();

                case VMArray array:
                    if (serialized.Any(p => ReferenceEquals(p, array)))
                    {
                        throw new NotSupportedException();
                    }
                    serialized.Add(array);
                    if (array is Struct)
                    {
                        writer.Write((byte)StackItemType.Struct);
                    }
                    else
                    {
                        writer.Write((byte)StackItemType.Array);
                    }
                    writer.WriteVarInt(array.Count);
                    for (int i = array.Count - 1; i >= 0; i--)
                    {
                        unserialized.Push(array[i]);
                    }
                    break;

                case Map map:
                    if (serialized.Any(p => ReferenceEquals(p, map)))
                    {
                        throw new NotSupportedException();
                    }
                    serialized.Add(map);
                    writer.Write((byte)StackItemType.Map);
                    writer.WriteVarInt(map.Count);
                    foreach (var pair in map.Reverse())
                    {
                        unserialized.Push(pair.Value);
                        unserialized.Push(pair.Key);
                    }
                    break;
                }
            }
        }