dash/test/functional/rpc_masternode.py

99 lines
5.2 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
# Copyright (c) 2020-2023 The Dash Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
from test_framework.test_framework import DashTestFramework
from test_framework.util import assert_equal
'''
rpc_masternode.py
Test "masternode" rpc subcommands
'''
class RPCMasternodeTest(DashTestFramework):
def set_test_params(self):
self.set_dash_test_params(4, 3, fast_dip3_enforcement=True)
def run_test(self):
self.log.info("test that results from `winners` and `payments` RPCs match")
blockhash = ""
payments = []
# we expect some masternodes to have 0 operator reward and some to have non-0 operator reward
checked_0_operator_reward = False
checked_non_0_operator_reward = False
while not checked_0_operator_reward or not checked_non_0_operator_reward:
self.nodes[0].generate(1)
bi = self.nodes[0].getblockchaininfo()
height = bi["blocks"]
blockhash = bi["bestblockhash"]
winners_payee = self.nodes[0].masternode("winners")[str(height)]
payments = self.nodes[0].masternode("payments", blockhash)
assert_equal(len(payments), 1)
payments_block = payments[0]
payments_block_payees = payments_block["masternodes"][0]["payees"]
payments_payee = ""
for i in range(0, len(payments_block_payees)):
payments_payee += payments_block_payees[i]["address"]
if i < len(payments_block_payees) - 1:
payments_payee += ", "
assert_equal(payments_block["height"], height)
assert_equal(payments_block["blockhash"], blockhash)
assert_equal(winners_payee, payments_payee)
if len(payments_block_payees) == 1:
checked_0_operator_reward = True
if len(payments_block_payees) > 1:
checked_non_0_operator_reward = True
self.log.info("test various `payments` RPC options")
payments1 = self.nodes[0].masternode("payments", blockhash, -1)
assert_equal(payments, payments1)
payments2_1 = self.nodes[0].masternode("payments", blockhash, 2)
# using chaintip as a start block should return 1 block only
assert_equal(len(payments2_1), 1)
assert_equal(payments[0], payments2_1[0])
payments2_2 = self.nodes[0].masternode("payments", blockhash, -2)
# using chaintip as a start block should return 2 blocks now, with the tip being the last one
assert_equal(len(payments2_2), 2)
assert_equal(payments[0], payments2_2[-1])
self.log.info("test that `masternode payments` results at chaintip match `getblocktemplate` results for that block")
gbt_masternode = self.nodes[0].getblocktemplate()["masternode"]
self.nodes[0].generate(1)
payments_masternode = self.nodes[0].masternode("payments")[0]["masternodes"][0]
for i in range(0, len(gbt_masternode)):
assert_equal(gbt_masternode[i]["payee"], payments_masternode["payees"][i]["address"])
assert_equal(gbt_masternode[i]["script"], payments_masternode["payees"][i]["script"])
assert_equal(gbt_masternode[i]["amount"], payments_masternode["payees"][i]["amount"])
self.log.info("test that `masternode payments` results and `protx info` results match")
# we expect some masternodes to have 0 operator reward and some to have non-0 operator reward
checked_0_operator_reward = False
checked_non_0_operator_reward = False
while not checked_0_operator_reward or not checked_non_0_operator_reward:
payments_masternode = self.nodes[0].masternode("payments")[0]["masternodes"][0]
protx_info = self.nodes[0].protx("info", payments_masternode["proTxHash"])
if len(payments_masternode["payees"]) == 1:
assert_equal(protx_info["state"]["payoutAddress"], payments_masternode["payees"][0]["address"])
checked_0_operator_reward = True
else:
assert_equal(len(payments_masternode["payees"]), 2)
option1 = protx_info["state"]["payoutAddress"] == payments_masternode["payees"][0]["address"] and \
protx_info["state"]["operatorPayoutAddress"] == payments_masternode["payees"][1]["address"]
option2 = protx_info["state"]["payoutAddress"] == payments_masternode["payees"][1]["address"] and \
protx_info["state"]["operatorPayoutAddress"] == payments_masternode["payees"][0]["address"]
assert option1 or option2
checked_non_0_operator_reward = True
self.nodes[0].generate(1)
self.log.info("test that `masternode outputs` show correct list")
addr1 = self.nodes[0].getnewaddress()
addr2 = self.nodes[0].getnewaddress()
self.nodes[0].sendmany('', {addr1: 1000, addr2: 1000})
self.nodes[0].generate(1)
# we have 3 masternodes that are running already and 2 new outputs we just created
assert_equal(len(self.nodes[0].masternode("outputs")), 5)
if __name__ == '__main__':
RPCMasternodeTest().main()