예제 #1
0
        public void TestInvalidTimestamp()
        {
            var test = CreateAPI();

            var simulator = test.simulator;
            var owner     = test.owner;
            var sender    = PhantasmaKeys.Generate();
            var node      = PhantasmaKeys.FromWIF(nodeWIF);
            var nexus     = simulator.Nexus;
            var api       = test.api;
            var random    = new Random();

            simulator.BeginBlock();
            simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, RelayFeePerMessage * 100);
            simulator.EndBlock();

            TopUpChannel(simulator, sender, RelayFeePerMessage * 10);

            var script = new byte[20];

            random.NextBytes(script);

            var message = new RelayMessage
            {
                nexus     = "invalid nexus",
                index     = 0,
                receiver  = node.Address,
                script    = script,
                sender    = sender.Address,
                timestamp = DateTime.Now.AddYears(200)
            };

            var    receipt       = RelayReceipt.FromMessage(message, sender);
            string serializedHex = Base16.Encode(receipt.Serialize());

            api.RelaySend(serializedHex);

            Assert.ThrowsException <ChainException>(() =>
            {
                simulator.BeginBlock();
                var tx = simulator.GenerateCustomTransaction(sender, ProofOfWork.None, () =>
                                                             ScriptUtils.BeginScript().AllowGas(sender.Address, Address.Null, 1, 9999)
                                                             .CallContract("relay", nameof(RelayContract.SettleChannel), receipt).
                                                             SpendGas(sender.Address).EndScript());
                simulator.EndBlock();
            }, "should have thrown exception due to wrong nexus name");
        }
예제 #2
0
        public void TestSendReceive()
        {
            var test = CreateAPI();

            var simulator = test.simulator;
            var owner     = test.owner;
            var sender    = PhantasmaKeys.Generate();
            var receiver  = PhantasmaKeys.Generate();
            var node      = PhantasmaKeys.FromWIF(nodeWIF);
            var nexus     = simulator.Nexus;
            var api       = test.api;

            simulator.BeginBlock();
            simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, 100000000);
            simulator.EndBlock();

            var desiredChannelBalance = RelayFeePerMessage * 10;

            TopUpChannel(simulator, sender, desiredChannelBalance);

            var channelBalance = nexus.RootChain.InvokeContract(simulator.Nexus.RootStorage, "relay", "GetBalance", sender.Address).AsNumber();

            Assert.IsTrue(channelBalance == desiredChannelBalance);

            var messageCount = 5;
            var messages     = new RelayMessage[messageCount];

            var random = new Random();

            for (int i = 0; i < messageCount; i++)
            {
                var script = new byte[100];
                random.NextBytes(script);

                var message = new RelayMessage
                {
                    nexus     = nexus.Name,
                    index     = i,
                    receiver  = receiver.Address, //node.Address,
                    script    = script,
                    sender    = sender.Address,
                    timestamp = Timestamp.Now
                };
                messages[i] = message;

                var    receipt       = RelayReceipt.FromMessage(message, sender);
                string serializedHex = Base16.Encode(receipt.Serialize());

                api.RelaySend(serializedHex);
            }

            var receipts = (ArrayResult)api.RelayReceive(receiver.Address.Text);

            Assert.IsTrue(receipts.values.Length == messageCount);

            for (int i = 0; i < messageCount; i++)
            {
                var obj = receipts.values[i];
                Assert.IsTrue(obj is ReceiptResult);

                var receiptResult = (ReceiptResult)obj;
                Assert.IsTrue(receiptResult.nexus == messages[i].nexus);
                Assert.IsTrue(new BigInteger(receiptResult.index, 10) == messages[i].index);
                //Assert.IsTrue(receiptResult.receiver == messages[i].receiver);
                //Assert.IsTrue(receiptResult.script == messages[i].script);
                //Assert.IsTrue(receiptResult.sender == messages[i].sender);
                Assert.IsTrue(receiptResult.timestamp == messages[i].timestamp);
            }
        }
예제 #3
0
        public void TestIndexGap()
        {
            var test = CreateAPI();

            var simulator = test.simulator;
            var owner     = test.owner;
            var sender    = PhantasmaKeys.Generate();
            var receiver  = PhantasmaKeys.Generate();
            var node      = PhantasmaKeys.FromWIF(nodeWIF);
            var nexus     = simulator.Nexus;
            var api       = test.api;

            var contractAddress = SmartContract.GetAddressForName("relay");

            simulator.BeginBlock();
            simulator.GenerateTransfer(owner, sender.Address, nexus.RootChain, DomainSettings.FuelTokenSymbol, 100000000);
            simulator.EndBlock();

            TopUpChannel(simulator, sender, 1000000);

            var indexGap     = 5;
            var messageCount = 3;
            var messages     = new RelayMessage[messageCount];

            var random = new Random();

            for (int i = 0; i < messageCount; i++)
            {
                var script = new byte[100];
                random.NextBytes(script);

                var message = new RelayMessage
                {
                    nexus     = nexus.Name,
                    index     = i * indexGap,
                    receiver  = receiver.Address, //node.Address,
                    script    = script,
                    sender    = sender.Address,
                    timestamp = Timestamp.Now
                };
                messages[i] = message;

                var    receipt       = RelayReceipt.FromMessage(message, sender);
                string serializedHex = Base16.Encode(receipt.Serialize());

                api.RelaySend(serializedHex);
            }

            var receipts = (ArrayResult)api.RelayReceive(receiver.Address.Text);

            Assert.IsTrue(receipts.values.Length == messageCount);

            for (int i = 0; i < messageCount; i++)
            {
                var obj = receipts.values[i];
                Assert.IsTrue(obj is ReceiptResult);

                var receiptResult = (ReceiptResult)obj;
                Assert.IsTrue(receiptResult.nexus == messages[i].nexus);
                Assert.IsTrue(new BigInteger(receiptResult.index, 10) == messages[i].index);
                //Assert.IsTrue(receiptResult.receiver == messages[i].receiver);
                //Assert.IsTrue(receiptResult.script == messages[i].script);
                //Assert.IsTrue(receiptResult.sender == messages[i].sender);
                Assert.IsTrue(receiptResult.timestamp == messages[i].timestamp);
            }

            var lastMessage = messages[messageCount - 1];
            var lastReceipt = RelayReceipt.FromMessage(lastMessage, sender);

            var fuelToken = simulator.Nexus.GetTokenInfo(simulator.Nexus.RootStorage, DomainSettings.FuelTokenSymbol);

            var senderInitialBalance   = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, sender.Address);
            var chainInitialBalance    = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, contractAddress);
            var receiverInitialBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, node.Address);

            simulator.BeginBlock();
            var tx = simulator.GenerateCustomTransaction(sender, ProofOfWork.None, () =>
                                                         ScriptUtils.BeginScript().AllowGas(sender.Address, Address.Null, 1, 9999)
                                                         .CallContract("relay", nameof(RelayContract.SettleChannel), lastReceipt).
                                                         SpendGas(sender.Address).EndScript());

            simulator.EndBlock();

            var txCost = simulator.Nexus.RootChain.GetTransactionFee(tx);

            var senderFinalBalance   = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, sender.Address);
            var chainFinalBalance    = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, contractAddress);
            var receiverFinalBalance = simulator.Nexus.RootChain.GetTokenBalance(simulator.Nexus.RootStorage, fuelToken, receiver.Address);

            var expectedFee = RelayFeePerMessage * (lastReceipt.message.index + 1);

            Assert.IsTrue(senderFinalBalance == senderInitialBalance - txCost);
            Assert.IsTrue(receiverFinalBalance == receiverInitialBalance + (expectedFee / 2));
            Assert.IsTrue(chainFinalBalance == chainInitialBalance - (expectedFee / 2));    //the sender's balance is escrowed in the chain address, so the chain just sends the other half of the fee away to the receiver
        }