Exemplo n.º 1
0
                static byte[] CreateSignatureRedeemScript(DevWalletAccount account)
                {
                    var key = account.GetKey();

                    if (key == null)
                    {
                        throw new Exception("DevWalletAccount missing key");
                    }

                    using var sb = new Neo.VM.ScriptBuilder();
                    sb.EmitPush(key.PublicKey.EncodePoint(true));
                    sb.Emit(Neo.VM.OpCode.CHECKSIG);
                    return(sb.ToArray());
                }
Exemplo n.º 2
0
 public static ScriptBuilder EmitPush(this ScriptBuilder sb, ContractParameter parameter)
 {
     switch (parameter.Type)
     {
         case ContractParameterType.Signature:
         case ContractParameterType.ByteArray:
             sb.EmitPush((byte[])parameter.Value);
             break;
         case ContractParameterType.Boolean:
             sb.EmitPush((bool)parameter.Value);
             break;
         case ContractParameterType.Integer:
             if (parameter.Value is BigInteger bi)
                 sb.EmitPush(bi);
             else
                 sb.EmitPush((BigInteger)typeof(BigInteger).GetConstructor(new[] { parameter.Value.GetType() }).Invoke(new[] { parameter.Value }));
             break;
         case ContractParameterType.Hash160:
             sb.EmitPush((UInt160)parameter.Value);
             break;
         case ContractParameterType.Hash256:
             sb.EmitPush((UInt256)parameter.Value);
             break;
         case ContractParameterType.PublicKey:
             sb.EmitPush((ECPoint)parameter.Value);
             break;
         case ContractParameterType.String:
             sb.EmitPush((string)parameter.Value);
             break;
         case ContractParameterType.Array:
             {
                 IList<ContractParameter> parameters = (IList<ContractParameter>)parameter.Value;
                 for (int i = parameters.Count - 1; i >= 0; i--)
                     sb.EmitPush(parameters[i]);
                 sb.EmitPush(parameters.Count);
                 sb.Emit(OpCode.PACK);
             }
             break;
         default:
             throw new ArgumentException();
     }
     return sb;
 }
Exemplo n.º 3
0
        /// <summary>
        /// Emits the opcodes for pushing the specified data onto the stack.
        /// </summary>
        /// <param name="builder">The <see cref="ScriptBuilder"/> to be used.</param>
        /// <param name="obj">The data to be pushed.</param>
        /// <returns>The same instance as <paramref name="builder"/>.</returns>
        public static ScriptBuilder EmitPush(this ScriptBuilder builder, object obj)
        {
            switch (obj)
            {
            case bool data:
                builder.EmitPush(data);
                break;

            case byte[] data:
                builder.EmitPush(data);
                break;

            case string data:
                builder.EmitPush(data);
                break;

            case BigInteger data:
                builder.EmitPush(data);
                break;

            case ISerializable data:
                builder.EmitPush(data);
                break;

            case sbyte data:
                builder.EmitPush(data);
                break;

            case byte data:
                builder.EmitPush(data);
                break;

            case short data:
                builder.EmitPush(data);
                break;

            case ushort data:
                builder.EmitPush(data);
                break;

            case int data:
                builder.EmitPush(data);
                break;

            case uint data:
                builder.EmitPush(data);
                break;

            case long data:
                builder.EmitPush(data);
                break;

            case ulong data:
                builder.EmitPush(data);
                break;

            case Enum data:
                builder.EmitPush(BigInteger.Parse(data.ToString("d")));
                break;

            case ContractParameter data:
                builder.EmitPush(data);
                break;

            case null:
                builder.Emit(OpCode.PUSHNULL);
                break;

            default:
                throw new ArgumentException(null, nameof(obj));
            }
            return(builder);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Emits the opcodes for pushing the specified data onto the stack.
        /// </summary>
        /// <param name="builder">The <see cref="ScriptBuilder"/> to be used.</param>
        /// <param name="parameter">The data to be pushed.</param>
        /// <returns>The same instance as <paramref name="builder"/>.</returns>
        public static ScriptBuilder EmitPush(this ScriptBuilder builder, ContractParameter parameter)
        {
            if (parameter.Value is null)
            {
                builder.Emit(OpCode.PUSHNULL);
            }
            else
            {
                switch (parameter.Type)
                {
                case ContractParameterType.Signature:
                case ContractParameterType.ByteArray:
                    builder.EmitPush((byte[])parameter.Value);
                    break;

                case ContractParameterType.Boolean:
                    builder.EmitPush((bool)parameter.Value);
                    break;

                case ContractParameterType.Integer:
                    if (parameter.Value is BigInteger bi)
                    {
                        builder.EmitPush(bi);
                    }
                    else
                    {
                        builder.EmitPush((BigInteger)typeof(BigInteger).GetConstructor(new[] { parameter.Value.GetType() }).Invoke(new[] { parameter.Value }));
                    }
                    break;

                case ContractParameterType.Hash160:
                    builder.EmitPush((UInt160)parameter.Value);
                    break;

                case ContractParameterType.Hash256:
                    builder.EmitPush((UInt256)parameter.Value);
                    break;

                case ContractParameterType.PublicKey:
                    builder.EmitPush((ECPoint)parameter.Value);
                    break;

                case ContractParameterType.String:
                    builder.EmitPush((string)parameter.Value);
                    break;

                case ContractParameterType.Array:
                {
                    IList <ContractParameter> parameters = (IList <ContractParameter>)parameter.Value;
                    for (int i = parameters.Count - 1; i >= 0; i--)
                    {
                        builder.EmitPush(parameters[i]);
                    }
                    builder.EmitPush(parameters.Count);
                    builder.Emit(OpCode.PACK);
                }
                break;

                case ContractParameterType.Map:
                {
                    var pairs = (IList <KeyValuePair <ContractParameter, ContractParameter> >)parameter.Value;
                    builder.CreateMap(pairs);
                }
                break;

                default:
                    throw new ArgumentException(null, nameof(parameter));
                }
            }
            return(builder);
        }
Exemplo n.º 5
0
 public static ScriptBuilder Emit(this ScriptBuilder sb, params OpCode[] ops)
 {
     foreach (OpCode op in ops)
         sb.Emit(op);
     return sb;
 }