示例#1
0
        private void AddMultisigChWallet(byte[] addr, MultisigWalletChangeType change_type, byte[] signer_pub_key, byte[] signer_nonce)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    bw.Write(multisigStartMarker[0]);
                    bw.Write(multisigStartMarker[1]);
                    bw.Write((byte)change_type);

                    bw.Write(addr.Length);
                    bw.Write(addr);

                    bw.Write(signer_pub_key.Length);
                    bw.Write(signer_pub_key);

                    bw.Write(signer_nonce.Length);
                    bw.Write(signer_nonce);

                    data = ms.ToArray();
                }
            }
        }
示例#2
0
        private object getChangeMultisigWalletData()
        {
            if (data == null || data.Length < 6)
            {
                return(null);
            }
            using (MemoryStream ms = new MemoryStream(data))
            {
                using (BinaryReader rd = new BinaryReader(ms))
                {
                    try
                    {
                        byte start_marker_1 = rd.ReadByte();
                        byte start_marker_2 = rd.ReadByte();
                        if (start_marker_1 != multisigStartMarker[0] || start_marker_2 != multisigStartMarker[1])
                        {
                            Logging.warn(String.Format("Multisig change transaction: Invalid multisig transaction: Data start marker does not match! ({0}, {1})", start_marker_1, start_marker_2));
                            return(null);
                        }
                        // multisig change type
                        MultisigWalletChangeType change_type = (MultisigWalletChangeType)rd.ReadByte();
                        switch (change_type)
                        {
                        case MultisigWalletChangeType.AddSigner:
                            int ch_addr_len = rd.ReadInt32();
                            if (ch_addr_len < 36 || ch_addr_len > 128)
                            {
                                Logging.warn("Multisig change transaction: Adding signer, but the data does not contain a valid address!");
                                return(null);
                            }
                            byte[] ch_addr = rd.ReadBytes(ch_addr_len);
                            if (ch_addr == null || ch_addr.Length < ch_addr_len)
                            {
                                Logging.warn("Multisig change transaction: Adding signer, but the address data was corrupted.");
                                return(null);
                            }

                            int signer_pub_key_len = rd.ReadInt32();
                            if (signer_pub_key_len < 36 || signer_pub_key_len > 2500)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len));
                                return(null);
                            }
                            if (signer_pub_key_len == 0)
                            {
                                return(null);
                            }
                            byte[] signer_pub_key = rd.ReadBytes(signer_pub_key_len);

                            int signer_nonce_len = rd.ReadInt32();
                            if (signer_nonce_len > 16)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len));
                                return(null);
                            }
                            byte[] signer_nonce = rd.ReadBytes(signer_nonce_len);

                            return(new MultisigAddrAdd
                            {
                                addrToAdd = ch_addr,
                                signerPubKey = signer_pub_key,
                                signerNonce = signer_nonce
                            });

                        case MultisigWalletChangeType.DelSigner:
                            ch_addr_len = rd.ReadInt32();
                            if (ch_addr_len < 36 || ch_addr_len > 128)
                            {
                                Logging.warn("Multisig change transaction: Deleting signer, but the data does not contain a valid address!");
                                return(null);
                            }
                            ch_addr = rd.ReadBytes(ch_addr_len);
                            if (ch_addr == null || ch_addr.Length < ch_addr_len)
                            {
                                Logging.warn("Multisig change transaction: Deleting signer, but the address data was corrupted.");
                                return(null);
                            }

                            signer_pub_key_len = rd.ReadInt32();
                            if (signer_pub_key_len < 36 || signer_pub_key_len > 2500)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len));
                                return(null);
                            }
                            if (signer_pub_key_len == 0)
                            {
                                return(null);
                            }
                            signer_pub_key = rd.ReadBytes(signer_pub_key_len);

                            signer_nonce_len = rd.ReadInt32();
                            if (signer_nonce_len > 16)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len));
                                return(null);
                            }
                            signer_nonce = rd.ReadBytes(signer_nonce_len);

                            return(new MultisigAddrDel
                            {
                                addrToDel = ch_addr,
                                signerPubKey = signer_pub_key,
                                signerNonce = signer_nonce
                            });

                        case MultisigWalletChangeType.ChangeReqSigs:
                            byte new_req_sigs = rd.ReadByte();

                            signer_pub_key_len = rd.ReadInt32();
                            if (signer_pub_key_len < 36 || signer_pub_key_len > 2500)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer pub key length stored in data: {0}", signer_pub_key_len));
                                return(null);
                            }
                            if (signer_pub_key_len == 0)
                            {
                                return(null);
                            }
                            signer_pub_key = rd.ReadBytes(signer_pub_key_len);

                            signer_nonce_len = rd.ReadInt32();
                            if (signer_nonce_len > 16)
                            {
                                Logging.warn(String.Format("Multisig transaction: Invalid signer nonce length stored in data: {0}", signer_nonce_len));
                                return(null);
                            }
                            signer_nonce = rd.ReadBytes(signer_nonce_len);

                            return(new MultisigChSig
                            {
                                reqSigs = new_req_sigs,
                                signerPubKey = signer_pub_key,
                                signerNonce = signer_nonce
                            });

                        default:
                            Logging.warn(String.Format("Invalid MultisigWalletChangeType for a multisig change transaction {{ {0} }}.", id));
                            return(null);
                        }
                    }
                    catch (Exception)
                    {
                        // early EOL or strange data error
                        return(null);
                    }
                }
            }
        }