def test_is_cancellable():
    """ test if a transaction is cancellable """
    # Setup
    ledger_1 = ledger.Ledger('monies')
    tid_0 = 0
    ledger_1.transaction_cancelled_tids = [1, 5, 7]
    ledger_1.transaction_sequence = 100

    # Test when transaction doesn't exist
    true_or_false = ledger_1.is_cancellable(tid_0)
    assert true_or_false == False

    # test when transaction exists
    tid_3 = 3
    true_or_false = ledger_1.is_cancellable(tid_3)
    assert true_or_false == True

    # test when the transaction is itself
    tid_5 = 5
    ledger_1.transaction_sequence = 5
    true_or_false = ledger_1.is_cancellable(tid_5)
    assert true_or_false == False

    # test when the transaction is the first one
    tid_5 = 5
    ledger_1.transaction_sequence = 6
    ledger_1._block_limit = 0
    true_or_false = ledger_1.is_cancellable(tid_5)
    assert true_or_false == False
示例#2
0
def readOld(inFile):
    with inFile.open("r") as f:
        transactions = yaml.load(f, Loader=FullLoader)
        ledger_ = ledger.Ledger()
        for str_transaction in transactions:
            transaction = getTransaction(ledger_, str_transaction)
            ledger_.addTransaction(transaction)
    return ledger_
示例#3
0
    def __init__(self, n):
        self.nodes = []
        self.lastProps = [[], [], [], []]
        self.lastVals = [ledger.Ledger()] * n
        for i in range(n):
            if i == 3:

                self.nodes.append(node.Node(self, i))
            else:
                self.nodes.append(node_random.RandomNode(self, i))
        self.round = 0
        self.stringarray = []
示例#4
0
def read(inFile):
    with inFile.open("r") as f:
        lines = f.readlines()
        topAccount, accounts = getAccountsFromLines(lines)
        transactions = [
            Transaction.deserialize(line, accounts) for line in lines
        ]
        ledger_ = ledger.Ledger()
        ledger_.topAccount = topAccount
        for transaction in transactions:
            ledger_.addTransaction(transaction)
        x = ledger_.topAccount.reset()
        return ledger_
示例#5
0
    def __init__(self, lines):
        """Receives a list of line Guids
            [Guid, ...]
        """
        self.drone_ledger = ledger.Ledger(lines)
        # self.coord_ledger = ledger.Ledger()
        # self.coord_ledger.complete_as_coord_ledger(lines)
        # self.line_ledger = ledger.Ledger()
        # self.line_ledger.complete_as_line_ledger(lines)

        # self.coord_ledger = self.make_new_coord_ledger(lines)
        # self.line_ledger = self.make_new_line_ledger(lines)
        self.tab = '    '
示例#6
0
    def __init__(self, env, id, ledg=None):
        self.queue = []
        self.transactions = []
        self.lastVals = []
        self.propositions = []
        if ledg is None:

            self.currentLedger = ledger.Ledger(None, [])
        else:
            self.currentLedger = ledg
        self.round = 0
        self.id = id
        self.env = env
        self.roundstring = ""
示例#7
0
 def make_new_coord_ledger(self, lines):
     """Receives a list of line Guids:
         [Guid, ...]
     Returns a list of coords:
         [(num, num, num), ...]
     """
     coords = []
     for line in lines:
         points = rs.CurvePoints(line)
         for p in points:
             coord = (p.X, p.Y, p.Z)
             coords.append(coord)
     coord_ledger = ledger.Ledger(coords)
     print('coord ledger: %s' % coord_ledger.elements)
     return coord_ledger
def test_median_value():
    """ Test transactions on ledger can return the median """
    # Setup
    ledger_1 = ledger.Ledger('monies')

    # test when no there are no values
    ledger_1.transaction_values = []
    assert ledger_1.median_value() == 0

    # test when it is odd
    ledger_1.transaction_values = [1, 5, 7]
    assert ledger_1.median_value() == 5

    # test sort and even numbers
    ledger_1.transaction_values = [1, 7, 6, 5]
    assert ledger_1.median_value() == 5.5
def test_is_block_full():
    """ test if a block is full """
    # Setup
    ledger_2 = ledger.Ledger('monies2')

    # test base case
    true_or_false = ledger_2.is_block_full()
    assert true_or_false == False

    # test if there are 256 transactions and limit is 256
    ledger_2.transaction_sequence = 256
    true_or_false = ledger_2.is_block_full()
    assert true_or_false == True

    # test if there are 255 transactions
    ledger_2.transaction_sequence = 255
    true_or_false = ledger_2.is_block_full()
    assert true_or_false == False
示例#10
0
    def Login_System(self):
        u = (self.Username.get())
        p = (self.Password.get())

        if (u == str(1) and p == str(1)):
            self.frame.destroy()
            # self.frame.pack_forget()
            # frameobj.pack() to show
            # frameobj.grid_forget() to hide
            # frameobj.pack_forget() to hide

            ledger.Ledger(self.master)
            # Demo2(self.master, self.master)
        else:
            tkinter.messagebox.showinfo("Login Systems",
                                        "Invalid login details")
            self.Username.set("")
            self.Password.set("")
            self.txtUsername.focus()
示例#11
0
 def make_new_line_ledger(self, lines):
     """Receives a list of line Guids:
         [Guid, ...]
     Returns a list of line coord index pairs:
         [(int, int), ...]
     """
     index_pairs = []
     for line in lines:
         points = rs.CurvePoints(line)
         coord_pair = []
         for p in points:
             coord = (p.X, p.Y, p.Z)
             coord_pair.append(coord)
         index_pair = []
         for coord in coord_pair:
             index = self.coord_ledger.get_index(coord)
             index_pair.append(index)
         index_pairs.append(index_pair)
     line_ledger = ledger.Ledger(index_pairs)
     print('line ledger: %s' % line_ledger.elements)
     return line_ledger
示例#12
0
def run(args):
    hosts = ["localhost", "localhost"]

    ledger_filename = None

    with infra.ccf.network(hosts,
                           args.binary_dir,
                           args.debug_nodes,
                           args.perf_nodes,
                           pdb=args.pdb) as network:
        network.start_and_join(args)
        primary, term = network.find_primary()

        LOG.debug("Propose to add a new member (with a different curve)")
        infra.proc.ccall(
            network.key_generator,
            f"--name=member4",
            "--gen-key-share",
            f"--curve={infra.ccf.ParticipantsCurve.secp256k1.name}",
        )
        result, error = network.consortium.propose_add_member(
            1, primary, "member4_cert.pem", "member4_kshare_pub.pem")

        # When proposal is added the proposal id and the result of running
        # complete proposal are returned
        assert not result["completed"]
        proposal_id = result["id"]

        # 2 out of 3 members vote to accept the new member so that
        # that member can send its own proposals
        LOG.debug("2/3 members accept the proposal")
        result = network.consortium.vote(1, primary, proposal_id, True)
        assert result[0] and not result[1]

        LOG.debug("Failed vote as unsigned")
        result = network.consortium.vote(2, primary, proposal_id, True, True)
        assert (not result[0] and result[1]["code"]
                == infra.jsonrpc.ErrorCode.RPC_NOT_SIGNED.value)

        result = network.consortium.vote(2, primary, proposal_id, True)
        assert result[0] and result[1]

        ledger_filename = network.find_primary()[0].remote.ledger_path()

    LOG.debug("Audit the ledger file for member votes")
    l = ledger.Ledger(ledger_filename)

    # this maps a member_id to a cert object, and is updated when we iterate the transactions,
    # so that we always have the correct cert for a member on a given transaction
    members = {}
    verified_votes = 0

    for tr in l:
        tables = tr.get_public_domain().get_tables()
        members_table = tables["ccf.member_certs"]
        for cert, member_id in members_table.items():
            members[member_id] = cert

        if "ccf.voting_history" in tables:
            votinghistory_table = tables["ccf.voting_history"]
            for member_id, signed_request in votinghistory_table.items():
                # if the signed vote is stored - there has to be a member at this point
                assert member_id in members
                cert = members[member_id]
                sig = signed_request[0][0]
                req = signed_request[0][1]
                raw_req = signed_request[0][2]
                digest = signed_request[0][3]
                verify_sig(cert, sig, req, raw_req, digest)
                verified_votes += 1

    assert verified_votes >= 2
    def test_calculate_return(self):
        test_cases = [
            Case(
                name='Only good buys',
                args={
                    'last_known_price':
                    100,
                    'operations': [
                        ledger.Operation('BCHEUR', 1, 90, ledger.Buy),
                        ledger.Operation('BCHEUR', 1, 95, ledger.Buy),
                        ledger.Operation('BCHEUR', 1, 100, ledger.Buy),
                    ],
                },
                expected=15,
            ),
            Case(
                name='Good and bad buys',
                args={
                    'last_known_price':
                    100,
                    'operations': [
                        ledger.Operation('BCHEUR', 1, 90, ledger.Buy),
                        ledger.Operation('BCHEUR', 1, 110, ledger.Buy),
                        ledger.Operation('BCHEUR', 1, 100, ledger.Buy),
                    ],
                },
                expected=0,
            ),
            Case(
                name='Only bad buys',
                args={
                    'last_known_price':
                    100,
                    'operations': [
                        ledger.Operation('BCHEUR', 1, 115, ledger.Buy),
                        ledger.Operation('BCHEUR', 0.5, 55, ledger.Buy),
                    ],
                },
                expected=-20,
            ),
            Case(
                name='Only good sells',
                args={
                    'last_known_price':
                    100,
                    'operations': [
                        ledger.Operation('BCHEUR', 1, 115, ledger.Sell),
                        ledger.Operation('BCHEUR', 1, 110, ledger.Sell),
                        ledger.Operation('BCHEUR', 1, 100, ledger.Sell),
                    ],
                },
                expected=25,
            ),
            Case(
                name='Only bad sells',
                args={
                    'last_known_price':
                    100,
                    'operations': [
                        ledger.Operation('BCHEUR', 1, 80, ledger.Sell),
                        ledger.Operation('BCHEUR', 0.5, 45, ledger.Sell),
                        ledger.Operation('BCHEUR', 1, 100, ledger.Sell),
                    ],
                },
                expected=-25,
            ),
        ]

        for test_case in test_cases:
            test_ledger = ledger.Ledger('BCHEUR')
            test_ledger.operations = test_case.args['operations']

            got = test_ledger.calculate_return(
                test_case.args['last_known_price'])
            self.assertEqual(got, test_case.expected, test_case.name)
示例#14
0
def run(args):
    hosts = ["localhost", "localhost"]

    ledger_filename = None

    with infra.ccf.network(hosts,
                           args.build_dir,
                           args.debug_nodes,
                           args.perf_nodes,
                           pdb=args.pdb) as network:
        primary, others = network.start_and_join(args)

        # propose to add a new member
        # proposal number 0
        infra.proc.ccall("./genesisgenerator", "cert", "--name=member4")
        result = infra.proc.ccall(
            "./memberclient",
            "add_member",
            "--cert=member1_cert.pem",
            "--privk=member1_privk.pem",
            "--host={}".format(primary.host),
            "--port={}".format(primary.tls_port),
            "--member_cert=member4_cert.pem",
            "--ca=networkcert.pem",
        )

        # when proposal is added the proposal id and the result of running complete proposal are returned
        j_result = json.loads(result.stdout)
        assert not j_result["result"]["completed"]
        assert j_result["result"]["id"] == 0

        # 2 out of 3 members vote to accept the new member so that that member can send its own proposals
        result = infra.proc.ccall(
            "./memberclient",
            "vote",
            "--accept",
            "--cert=member1_cert.pem",
            "--privk=member1_privk.pem",
            "--host={}".format(primary.host),
            "--port={}".format(primary.tls_port),
            "--id=0",
            "--ca=networkcert.pem",
            "--sign",
        )
        j_result = json.loads(result.stdout)
        assert not j_result["result"]

        # this request should fail, as it is not signed
        result = infra.proc.ccall(
            "./memberclient",
            "vote",
            "--accept",
            "--cert=member2_cert.pem",
            "--privk=member2_privk.pem",
            "--host={}".format(primary.host),
            "--port={}".format(primary.tls_port),
            "--id=0",
            "--ca=networkcert.pem",
        )
        j_result = json.loads(result.stdout)
        assert j_result["error"][
            "code"] == infra.jsonrpc.ErrorCode.RPC_NOT_SIGNED.value

        result = infra.proc.ccall(
            "./memberclient",
            "vote",
            "--accept",
            "--cert=member2_cert.pem",
            "--privk=member2_privk.pem",
            "--host={}".format(primary.host),
            "--port={}".format(primary.tls_port),
            "--id=0",
            "--ca=networkcert.pem",
            "--sign",
        )
        j_result = json.loads(result.stdout)
        assert j_result["result"]

        ledger_filename = network.find_leader()[0].remote.ledger_path()

    l = ledger.Ledger(ledger_filename)

    # this maps a member_id to a cert object, and is updated when we iterate the transactions,
    # so that we always have the correct cert for a member on a given transaction
    members = {}
    verified_votes = 0
    for tr in l:
        tables = tr.get_public_domain().get_tables()
        members_table = tables["membercerts"]
        for cert, member_id in members_table.items():
            members[member_id] = cert

        if "votinghistory" in tables:
            votinghistory_table = tables["votinghistory"]
            for member_id, signed_request in votinghistory_table.items():
                # if the signed vote is stored - there has to be a member at this point
                assert member_id in members
                cert = members[member_id]
                sig = signed_request[0][0]
                req = signed_request[0][1]
                verify_sig(cert, sig, req)
                verified_votes += 1

    assert verified_votes >= 2
示例#15
0
 def __init__(self):
     self.ledger = ledger.Ledger()
示例#16
0
        if isinstance(message, ledger.Ledger):
            self.lastVals[i] = message
        else:
            self.lastProps[i] = message

    def receive(self):
        for temp in self.nodes:
            temp.lastVals = self.lastVals
            temp.propositions = self.lastProps.copy()


if __name__ == "__main__":
    random.seed(988999)

    env = Env(4)
    genesis_ledger = ledger.Ledger()
    env.lastVals = [
        genesis_ledger, genesis_ledger, genesis_ledger, genesis_ledger
    ]
    env.receive()
    for node_ in env.nodes:
        node_.start(genesis_ledger)
        node_.broadcast(genesis_ledger)

    env.receive()
    env.round = env.lastVals[0].sequence_num
    for i in range(4000):
        #while env.lastVals[3].sequence_num < n or env.lastVals[1].sequence_num < n \
        #       or env.lastVals[2].sequence_num < n or env.lastVals[0].sequence_num < n:
        #print(str(env.lastVals[0].sequence_num) + " " + str(env.lastVals[1].sequence_num) + " " + str(env.lastVals[2].sequence_num) + " " + str(env.lastVals[3].sequence_num))