Этот пост – краткое руководство по основным функциям pybitshares и uptick.
В этом туториале мы рассмотрим новую функцию, которая позволяет вам создать нового члена комитета, за которого затем могут голосовать держатели BTS.
1. Внедрение операции
Этот шаг устанавливает новый класс, который сообщает библиотеке, как называется и что делает эта конкретная операция.
Эти характеристики определяются глубоко в ядре bitshares-core. В этом примере мы более подробно рассмотрим protocol/Committee-member.hpp, идентифицируем элементы структуры и добавим их в том же порядке в pybitshares:
struct committee_member_create_operation : public base_operation
{
struct fee_parameters_type { uint64_t fee = 5000 * GRAPHENE_BLOCKCHAIN_PRECISION; };
asset fee;
/// The account which owns the committee_member. This account pays the fee for this operation.
account_id_type committee_member_account;
string url;
account_id_type fee_payer()const { return committee_member_account; }
void validate()const;
};
Для python-bitshares:
class Committee_member_create(GrapheneObject):
def __init__(self, *args, **kwargs):
if isArgsThisClass(self, args):
self.data = args[0].data
else:
if len(args) == 1 and len(kwargs) == 0:
kwargs = args[0]
super().__init__(OrderedDict([
('fee', Asset(kwargs["fee"])),
('committee_member_account', ObjectId(kwargs["committee_member_account"], "account")),
('url', String(kwargs["url"])),
]))
Важно, чтобы имя класса было идентично перечисленным здесь операциям, за исключением того, что первая буква – заглавная.
2. Тестирование операции
Теперь идем дальше и тестируем новую операцию через cli_wallet. Для этого мы запускаем cli_wallet и локально открываем API cli_wallet на порту 8092
. Затем мы устанавливаем новую операцию в вызов compareConstructedTX()
, как здесь.
Теперь, когда мы вызываем python3 tests/test_transactions.py
, получаем
{'expiration': '2016-04-06T08:29:27',
'extensions': [],
'operations': [[29,
{'committee_member_account': '1.2.0',
'fee': {'amount': 0, 'asset_id': '1.3.0'},
'url': 'foobar'}]],
'ref_block_num': 34294,
'ref_block_prefix': 3707022213,
'signatures': ['2035e1564b63c8fe55c0ba176044468ffbddffe0241792625de8365e55522f2488261ac0dd2e22aca4aeb6da48b0773837e89c4f36cfd86df1eb78119fe8a2d21e']}
================================================================================
soll: f68585abf4dce7c80457011d0000000000000000000006666f6f6261720001
ist: f68585abf4dce7c80457011d0000000000000000000006666f6f6261720001
True
Что сравнивает сериализацию cli-wallet с pybitshares.
В данном случае все выглядит отлично, и мы добавляем юнит-тест, как здесь.
Поскольку мы изначально не знаем результата, и нам не с чем его сравнить, мы можем использовать self.doIt(True)
, чтобы позволить юнит-тесту предоставить строку, с которой позже проведем сравнение.
Мы выполняем юнит-тест с помощью
python3 -m unittest tests.test_transactions.Testcases.test_committee_create
Выводимая строка затем сохраняется в self.cm
, так чтобы после юнит-тест прошел успешно.
3. Открытие доступа к функциональности в bithares.py
Теперь мы запишем API в bithares.py, чтобы сделать эту функцию доступной для удобства использования:
https://github.com/xeroc/python-bitshares/blob/8a556c0031186abe3084d3e44e3dd38bbe40f0cb/bitshares/bitshares.py#L1407-L1431
Наша цель здесь – это убедиться, что мы используем какой-либо аккаунт (по умолчанию, если таковой не указан), убедиться, что аккаунт существует, создать операцию и послать ее на подписание с помощью finalizeOp
. Она будет подписана активным ключом аккаунта, если этот ключ представлен в кошельке.
4. Интеграция в uptick
uptick
– инструмент командной строки, который активно использует pybitshares и python-click.
Использовать новую функцию очень просто, поскольку всё, что нам нужно сделать – это добавить новый метод, как здесь
@main.command()
@click.pass_context
@onlineChain
@click.argument('url', type=str)
@click.option(
"--account",
help="Account that takes this action",
default=config["default_account"],
type=str)
@unlockWallet
def createcommittee(ctx, url, account):
""" Setup a committee account for your account
"""
pprint(ctx.bitshares.create_committee_member(
url,
account=account
))
Надеюсь, это дало вам представление о том, насколько легко пользоваться python bithares и uptick. Если вы решите взять на себя демонстрацию некоторых из недостающих операций, пожалуйста, отправляйте мне свои пул реквесты.
Оригинал поста: ЗДЕСЬ