def test_generate_block():
    signing_key, account_number = create_account()
    encoded_account_number = encode_verify_key(verify_key=account_number)

    transactions = [{
        'amount': 1,
        'fee': BANK,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 1,
        'fee': PRIMARY_VALIDATOR,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 5,
        'memo': 'Hello there I am 123 years old',
        'recipient': random_encoded_account_number(),
    }]

    block = generate_block(account_number=account_number,
                           balance_lock=encoded_account_number,
                           signing_key=signing_key,
                           transactions=transactions)

    assert block['account_number'] == encoded_account_number
    assert block['message']['balance_key'] == encoded_account_number
    assert len(block['message']['txs']) == 3
    assert len(block['signature']) == SIGNATURE_LENGTH
示例#2
0
def test_generate_block():
    signing_key, account_number = create_account()
    encoded_account_number = encode_verify_key(verify_key=account_number)

    transactions = [{
        'amount': 1,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 1,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 5,
        'recipient': random_encoded_account_number(),
    }]

    block = generate_block(account_number=account_number,
                           balance_lock=encoded_account_number,
                           signing_key=signing_key,
                           transactions=transactions)

    assert block['account_number'] == encoded_account_number
    assert block['message']['balance_key'] == encoded_account_number
    assert len(block['message']['txs']) == 3
    assert len(block['signature']) == SIGNATURE_LENGTH

    # Verify that signature is valid and the message has not been modified
    verify_signature(message=sort_and_encode(block['message']),
                     signature=block['signature'],
                     verify_key=block['account_number'])
示例#3
0
def test_generate_block():
    signing_key, account_number = create_account()
    encoded_account_number = encode_verify_key(verify_key=account_number)

    transactions = [
        {
            'amount': 1,
            'recipient': random_encoded_account_number(),
        },
        {
            'amount': 1,
            'recipient': random_encoded_account_number(),
        },
        {
            'amount': 5,
            'recipient': random_encoded_account_number(),
        }
    ]

    block = generate_block(
        account_number=account_number,
        balance_lock=encoded_account_number,
        signing_key=signing_key,
        transactions=transactions
    )

    assert block['account_number'] == encoded_account_number
    assert block['message']['balance_key'] == encoded_account_number
    assert len(block['message']['txs']) == 3
    assert len(block['signature']) == SIGNATURE_LENGTH
示例#4
0
def test_network_block_serializer():
    signing_key, account_number = create_account()
    encoded_account_number = encode_verify_key(verify_key=account_number)

    transactions = [{
        'amount': 1,
        'fee': BANK,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 1,
        'fee': PRIMARY_VALIDATOR,
        'recipient': random_encoded_account_number(),
    }, {
        'amount': 5,
        'memo': 'Hello there I am 123 years old',
        'recipient': random_encoded_account_number(),
    }]

    block = generate_block(account_number=account_number,
                           balance_lock=encoded_account_number,
                           signing_key=signing_key,
                           transactions=transactions)

    serializer = NetworkBlockSerializer(data=block)
    assert serializer.is_valid()
示例#5
0
def bank_connection_requests_signed_request_new_node_identifier(bank):
    signing_key, _ = create_account()
    yield generate_signed_request(data={
        'ip_address': bank.ip_address,
        'port': bank.port,
        'protocol': bank.protocol,
    },
                                  nid_signing_key=signing_key)
示例#6
0
def create_account_and_save_signing_key_file(file):
    """
    Create a new account and save signing key to file

    Return signing_key, account_number
    """
    signing_key, account_number = create_account()
    write_signing_key_file(signing_key, file)
    return signing_key, account_number
示例#7
0
def validator_connection_requests_signed_request_connect_to_itself(
        primary_validator_configuration):
    signing_key, _ = create_account()
    yield generate_signed_request(data={
        'ip_address':
        primary_validator_configuration.ip_address,
        'port':
        primary_validator_configuration.port,
        'protocol':
        primary_validator_configuration.protocol,
    },
                                  nid_signing_key=signing_key)
示例#8
0
def block_data(account_data, encoded_account_number,
               random_encoded_account_number):
    signing_key, account_number = create_account()

    yield generate_block(account_number=account_number,
                         balance_lock=encode_verify_key(
                             verify_key=account_number, ),
                         signing_key=signing_key,
                         transactions=[{
                             'amount':
                             1,
                             'recipient':
                             random_encoded_account_number
                         }])
def block_data(account_data, encoded_account_number, random_encoded_account_number):
    signing_key, account_number = create_account()

    yield generate_block(
        account_number=account_number,
        balance_lock=encode_verify_key(
            verify_key=account_number,
        ),
        signing_key=signing_key,
        transactions=[
            {
                'amount': 4,
                'fee': PRIMARY_VALIDATOR,
                'recipient': 'ad1f8845c6a1abb6011a2a434a079a087c460657aad54329a84b406dce8bf314'
            },
            {
                'amount': 1,
                'recipient': random_encoded_account_number
            }
        ]
    )
示例#10
0
    def test_post(self):
        """
        Create block
        """

        signing_key, account_number = create_account()
        encoded_account_number = encode_verify_key(verify_key=account_number)
        Account.objects.create(account_number=encoded_account_number, trust=50)

        self_configuration = get_self_configuration(
            exception_class=RuntimeError)
        primary_validator = self_configuration.primary_validator

        block = generate_block(
            account_number=account_number,
            balance_lock=encoded_account_number,
            signing_key=signing_key,
            transactions=[{
                'amount':
                float(self_configuration.default_transaction_fee),
                'recipient':
                self_configuration.account_number
            }, {
                'amount':
                float(primary_validator.default_transaction_fee),
                'recipient':
                primary_validator.account_number
            }, {
                'amount':
                self.fake.pyfloat(min_value=1,
                                  max_value=100,
                                  positive=True,
                                  right_digits=4),
                'recipient':
                random_account_number()
            }])

        self.validate_post('/blocks', block, status.HTTP_201_CREATED)
示例#11
0
def account_data():
    yield create_account()
示例#12
0
def test_create_account():
    signing_key, account_number = create_account()

    assert isinstance(signing_key, SigningKey)
    assert isinstance(account_number, VerifyKey)
示例#13
0
文件: conftest.py 项目: maxide/Bank-1
def random_encoded_account_number():
    _, account_number = create_account()
    yield encode_verify_key(verify_key=account_number)
示例#14
0
def test_write_signing_key_file(tmpdir):
    file_path = tmpdir.join('signing_key_file')
    signing_key, account_number = create_account()
    write_signing_key_file(signing_key, file_path)

    assert signing_key == read_signing_key_file(file_path)
示例#15
0
def main():
    ssm_client: SSMClient = boto3.client('ssm')

    p = argparse.ArgumentParser(description='AWS provision and deploy.')
    p.add_argument('--env',
                   default='prod',
                   type=str,
                   help='Environment to run, default is prod.')
    p.add_argument(
        '--s3-bucket',
        required=True,
        type=str,
        help=
        '* The name of the S3 bucket where this command uploads the artifacts that are referenced in '
        'the template.')
    p.add_argument('--db-pass',
                   type=str_length_validator(min_len=8),
                   help='Database password to set.')
    p.add_argument('--sentry-dsn',
                   type=url_validator(),
                   help='DSN to set up Sentry tracking')

    p.add_argument(
        '--node-type',
        choices=[CONFIRMATION_VALIDATOR, PRIMARY_VALIDATOR],
        default=CONFIRMATION_VALIDATOR,
        help=
        'Network standardized type of node, default: CONFIRMATION_VALIDATOR.')
    p.add_argument('--primary-url',
                   type=url_validator(),
                   help='Primary validator URL (ex. http://10.10.10.10).')
    p.add_argument('--primary-trust',
                   type=int_validator(),
                   help='Trust level for the validator.')

    p.add_argument('--sign-key',
                   type=str_length_validator(length=64),
                   help='Network sign key.')
    p.add_argument('--node-identifier',
                   type=str_length_validator(length=VERIFY_KEY_LENGTH),
                   help='Public key used to sign requests to other nodes.')
    p.add_argument('--account-number',
                   required=True,
                   type=str_length_validator(length=VERIFY_KEY_LENGTH),
                   help='* The account number where Tx fees will be sent.')
    p.add_argument('--default-transaction-fee',
                   required=True,
                   type=int,
                   help='* Tx fee cost.')
    p.add_argument(
        '--seed-block-identifier',
        type=str_length_validator(length=BLOCK_IDENTIFIER_LENGTH),
        help=
        'Identifier of the last block that was used when the root account file was generated.'
    )
    p.add_argument(
        '--root-account-file',
        required=True,
        type=url_validator(suffix='.json'),
        help=
        '* Record of all account balances at the moment in time that the validator was first set to '
        '"primary".')
    p.add_argument('--version-number',
                   required=True,
                   type=str_length_validator(max_len=32),
                   help='* API version.')

    args = p.parse_args()

    if args.node_type == CONFIRMATION_VALIDATOR and not args.primary_url:
        p.error(
            '--primary-url is required when --node-type is CONFIRMATION_VALIDATOR.'
        )

    if args.node_type == CONFIRMATION_VALIDATOR and not args.primary_trust:
        p.error(
            '--primary-trust is required when --node-type is CONFIRMATION_VALIDATOR.'
        )

    db_pass = args.db_pass
    if not db_pass:
        db_pass = token_urlsafe(32)

    private_key, public_key = create_account()
    private_key = private_key.encode(encoder=HexEncoder).decode('utf-8')
    public_key = public_key.encode(encoder=HexEncoder).decode('utf-8')

    deploy_args = [
        f'ParameterKey=EnvironmentName,ParameterValue={args.env.capitalize()}',
        f'ParameterKey=MasterUserPassword,ParameterValue={db_pass}',
        f'ParameterKey=NetworkSigningKey,ParameterValue={args.sign_key or private_key}',
        f'ParameterKey=NodeType,ParameterValue={args.node_type}',
        f'ParameterKey=NodeIdentifier,ParameterValue={args.node_identifier or public_key}',
        f'ParameterKey=AccountNumber,ParameterValue={args.account_number}',
        f'ParameterKey=DefaultTransactionFee,ParameterValue={args.default_transaction_fee}',
        f'ParameterKey=RootAccountFile,ParameterValue={args.root_account_file}',
        f'ParameterKey=VersionNumber,ParameterValue={args.version_number}',
    ]
    if args.seed_block_identifier:
        deploy_args.append(
            f'ParameterKey=SeedBlockIdentifier,ParameterValue={args.seed_block_identifier}'
        )

    if args.node_type == CONFIRMATION_VALIDATOR:
        primary = urlparse(args.primary_url)
        deploy_args.extend([
            f'ParameterKey=PrimaryIp,ParameterValue={primary.hostname}',
            f'ParameterKey=PrimaryProto,ParameterValue={primary.scheme}',
            f'ParameterKey=PrimaryPort,ParameterValue={primary.port or 80}',
            f'ParameterKey=PrimaryTrust,ParameterValue={args.primary_trust}'
        ])

    if args.sentry_dsn:
        deploy_args.append(
            f'ParameterKey=DjangoSentryDSN,ParameterValue={args.sentry_dsn}')

    try:
        secret_key = ssm_client.get_parameter(
            Name=
            f'{args.env.capitalize()}ValidatorDjangoSecretKey{args.node_type}'
        )['Parameter']['Value']
        print(secret_key)
    except (ssm_client.exceptions.ParameterNotFound,
            ssm_client.exceptions.InvalidKeyId):
        secret_key = get_random_secret_key()

    deploy_args.append(
        f'ParameterKey=DjangoSecretKey,ParameterValue={secret_key}')

    subprocess.call([
        'sam', 'package', '--template-file', 'stack/env.cfn.yaml',
        '--s3-bucket', args.s3_bucket, '--output-template-file',
        'outputtemplate.yaml'
    ])

    subprocess.call([
        'sam', 'deploy', '--stack-name',
        f'{args.env.capitalize()}Validator{args.node_type}'.replace('_', '-'),
        '--template-file', 'outputtemplate.yaml', '--parameter-overrides',
        ' '.join(deploy_args), '--capabilities', 'CAPABILITY_AUTO_EXPAND',
        'CAPABILITY_NAMED_IAM'
    ])
示例#16
0
文件: gen_key.py 项目: WireROP/Bank-2
#!/usr/bin/env python
"""Generate account keys"""
from nacl.encoding import HexEncoder
from thenewboston.accounts.manage import create_account

private_key, public_key = create_account()
private_key = private_key.encode(encoder=HexEncoder).decode('utf-8')
public_key = public_key.encode(encoder=HexEncoder).decode('utf-8')
示例#17
0
def random_encoded_account_number():
    signing_key, account_number = create_account()
    return encode_verify_key(verify_key=account_number)