Пример #1
0
        protected override void ExecuteCommand(string[] args)
        {
            // TODO register hash lock account somewhere
            var bytes      = Convert.FromBase64String(secretArgument.Value);
            var secret     = new Secret(bytes);
            var revelation = new SecretRevelation(secret);

            WalletService.ImportDeclaration(aliasArgument.Value, revelation);

            var hash = secret.ComputeSecretHash(SecretHashType.SHA3);

            Console.WriteLine($"Hash {hash.Hash.ToBase64()}");
        }
Пример #2
0
        public void Transaction_DuplicateDeclarations()
        {
            using (var context = CreateContext())
            {
                var issuer = BTC_ISSUER;

                var signers = new List <Address>()
                {
                    CreateAccount().Address, CreateAccount().Address
                };
                var multi = new MultiSignature(signers, 2);
                //  Check multisig
                {
                    var signed = Transfer(issuer, multi.Address, Currency.BTC, 1, null, null, new List <TxDeclaration> {
                        multi, multi
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                // create timelock
                var timelock = new TimeLock(DateTime.Now.AddDays(-1).ToUnixTimestamp());
                // Check timelocks
                {
                    var signed = Transfer(issuer, timelock.Address, Currency.BTC, 1, null, null, new List <TxDeclaration> {
                        timelock, timelock
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                var secret   = Secret.GenerateSecret();
                var hashlock = new HashLock(secret.ComputeSecretHash(SecretHashType.SHA256));
                //  Check hashLock
                {
                    var signed = Transfer(issuer, hashlock.Address, Currency.BTC, 1, null, null, new List <TxDeclaration> {
                        hashlock, hashlock
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                var secretRevelation = new SecretRevelation(secret);
                //  Check Secret
                {
                    var signed = Transfer(issuer, hashlock.Address, Currency.BTC, 1, null, null, new List <TxDeclaration> {
                        secretRevelation, secretRevelation
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }
            }
        }
Пример #3
0
 private void Write(SecretRevelation secret)
 {
     Write(secret.Secret.Bytes);
 }
Пример #4
0
 public SecretRevelationEntity(long id, SecretRevelation secret)
 {
     DeclarationId    = id;
     SecretRevelation = secret;
 }
Пример #5
0
        public void TestHashTimeLock()
        {
            // TODO CANCEL sender + receiver

            // we can emulate hashtime lock behaviour
            using (var context = CreateContext())
            {
                var issuer = BTC_ISSUER;

                var sender   = CreateAccount();
                var receiver = CreateAccount();

                var timeunlocked = new TimeLock(DateTime.Now.AddDays(-1).ToUnixTimestamp());
                var timelocked   = new TimeLock(DateTime.Now.AddDays(1).ToUnixTimestamp());

                // TODO we are missing Hash160 : SHA256 + ripemd160
                // create secret hash
                var type       = SecretHashType.SHA3;
                var secret     = Secret.GenerateSecret();
                var hash       = secret.ComputeSecretHash(type);
                var hashlock   = new HashLock(hash);
                var revelation = new SecretRevelation(secret);

                // CLAIM receiver + hashlock
                var claim = new MultiSignature(new List <Address>()
                {
                    receiver.Address, hashlock.Address
                }, 2);
                // TIMEOUT sender + timelock
                var timeoutlocked = new MultiSignature(new List <Address>()
                {
                    sender.Address, timelocked.Address
                }, 2);
                var timeoutunlocked = new MultiSignature(new List <Address>()
                {
                    sender.Address, timeunlocked.Address
                }, 2);

                var hashtimelocked = new MultiSignature(new List <Address>()
                {
                    claim.Address, timeoutlocked.Address
                }, 1);
                var hashtimeunlocked = new MultiSignature(new List <Address>()
                {
                    claim.Address, timeoutunlocked.Address
                }, 1);

                // send money to hashtimelocked account
                {
                    var signed = Transfer(issuer, hashtimelocked.Address, Currency.BTC, 10, null, null, new List <TxDeclaration>()
                    {
                        hashtimelocked
                    });
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    Assert.IsTrue(context.TryGetAccount(issuer.Address.Encoded, out var issuerAccount));
                    Assert.IsTrue(context.TryGetAccount(hashtimelocked.Address.Encoded, out var hashtimelockedAccount));

                    // check that the money has been sent
                    Assert.IsTrue(issuerAccount.GetBalance(Currency.BTC) == -10);
                    Assert.IsTrue(hashtimelockedAccount.GetBalance(Currency.BTC) == 10);
                }

                // try timeout from hashtimelocked
                {
                    var signed = Transfer(hashtimelocked.Address, new List <PrivateKeyNotWallet>()
                    {
                        sender
                    }, sender, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        timelocked, timeoutlocked
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                // claim from hashtimelocked
                {
                    var signed = Transfer(hashtimelocked.Address, new List <PrivateKeyNotWallet>()
                    {
                        receiver
                    }, issuer.Address, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        hashlock, claim, revelation
                    });
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    // update data
                    Assert.IsTrue(context.TryGetAccount(issuer.Address.Encoded, out var issuerAccount));
                    Assert.IsTrue(context.TryGetAccount(hashtimelocked.Address.Encoded, out var hashtimelockedAccount));

                    // check that the money has been sent
                    Assert.IsTrue(issuerAccount.GetBalance(Currency.BTC) == 0);
                    Assert.IsTrue(hashtimelockedAccount.GetBalance(Currency.BTC) == 0);
                }

                // send money to hashtimeunlocked account
                {
                    var signed = Transfer(issuer, hashtimeunlocked.Address, Currency.BTC, 10, null, null, new List <TxDeclaration>()
                    {
                        hashtimeunlocked
                    });
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    Assert.IsTrue(context.TryGetAccount(issuer.Address.Encoded, out var issuerAccount));
                    Assert.IsTrue(context.TryGetAccount(hashtimeunlocked.Address.Encoded, out var hashtimeunlockedAccount));

                    // check that the money has been sent
                    Assert.IsTrue(issuerAccount.GetBalance(Currency.BTC) == -10);
                    Assert.IsTrue(hashtimeunlockedAccount.GetBalance(Currency.BTC) == 10);
                }

                // timeout from hashtimeunlocked
                {
                    var signed = Transfer(hashtimeunlocked.Address, new List <PrivateKeyNotWallet>()
                    {
                        sender
                    }, issuer.Address, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        timeunlocked, timeoutunlocked
                    });
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    // update data
                    Assert.IsTrue(context.TryGetAccount(issuer.Address.Encoded, out var issuerAccount));
                    Assert.IsTrue(context.TryGetAccount(hashtimeunlocked.Address.Encoded, out var hashtimeunlockedAccount));

                    // check that the money has been sent
                    Assert.IsTrue(issuerAccount.GetBalance(Currency.BTC) == 0);
                    Assert.IsTrue(hashtimeunlockedAccount.GetBalance(Currency.BTC) == 0);
                }
            }
        }
Пример #6
0
        public void TestHashLock()
        {
            using (var context = CreateContext())
            {
                var sender = BTC_ISSUER;

                // create secret hash
                var type       = SecretHashType.SHA3;
                var secret     = Secret.GenerateSecret();
                var hash       = secret.ComputeSecretHash(type);
                var hashlock   = new HashLock(hash);
                var revelation = new SecretRevelation(secret);

                // send money to hashlock account
                {
                    var signed = Transfer(sender, hashlock.Address, Currency.BTC, 10);
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    Assert.IsTrue(context.TryGetAccount(sender.Address.Encoded, out var senderAccount));
                    Assert.IsTrue(context.TryGetAccount(hashlock.Address.Encoded, out var hashlockAccount));

                    // check that the money has been sent
                    Assert.IsTrue(senderAccount.GetBalance(Currency.BTC) == -10);
                    Assert.IsTrue(hashlockAccount.GetBalance(Currency.BTC) == 10);
                }

                // try spend money without declaration and revelation
                {
                    var signed = Transfer(hashlock.Address, new List <PrivateKeyNotWallet>(), sender, Currency.BTC, 10);
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                // try spend money with declaration but without secret revelation
                {
                    var signed = Transfer(hashlock.Address, new List <PrivateKeyNotWallet>(), sender, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        hashlock
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                // try spend money with secret revelation but without declaration
                {
                    var signed = Transfer(hashlock.Address, new List <PrivateKeyNotWallet>(), sender, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        revelation
                    });
                    context.SendTransaction(signed, ResultCode.TransactionValidationFailed);
                }

                // spend money with hash
                {
                    var signed = Transfer(hashlock.Address, new List <PrivateKeyNotWallet>(), sender, Currency.BTC, 10, new List <TxDeclaration>()
                    {
                        hashlock, revelation
                    });
                    context.SendTransaction(signed);
                    Assert.IsTrue(context.TryCreateNextLedger());

                    Assert.IsTrue(context.TryGetAccount(sender.Address.Encoded, out var senderAccount));
                    Assert.IsTrue(context.TryGetAccount(hashlock.Address.Encoded, out var hashlockAccount));

                    // check that the money has been sent
                    Assert.IsTrue(senderAccount.GetBalance(Currency.BTC) == 0);
                    Assert.IsTrue(hashlockAccount.GetBalance(Currency.BTC) == 0);
                }
            }
        }
 private static Internals.SecretRevelation CreateSecret(SecretRevelation declaration)
 {
     return(new Internals.SecretRevelation(Convert.ToBase64String(declaration.Secret.Bytes)));
 }