📝 Как добавить новые функции чейна в pybitshares/uptick (@xeroc)

in bitshares •  7 years ago 

Этот пост – краткое руководство по основным функциям 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. Если вы решите взять на себя демонстрацию некоторых из недостающих операций, пожалуйста, отправляйте мне свои пул реквесты.


Переведено @blockchained

Оригинал поста: ЗДЕСЬ


Присоединяйтесь к чату в Telegram для обсуждения последних новостей Bitshares DEX


Если вам нравится то, что мы делаем - поддержите witness blockchained на Steem!


Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!