Быстрое введение транзакции (модель управления счетом) - PullRequest
0 голосов
/ 10 сентября 2018

Бытом проекта :

Github: https://github.com/Bytom/bytom

Эта часть предназначена для пользователей, которые отправляют транзакции в режиме собственного счета Бытом.

1 transaction Транзакция построения

Транзакция API-интерфейса, транзакция , коды api / transact.go # L120

Возьмем транзакции со стандартным активом, не относящимся к BTM, например, , Актив BTM, идентификатор которого состоит из F, является только газом в этой транзакции. Эта транзакция означает, что на указанный адрес тратится 99 указанных активов , json встроенной транзакции его входного запроса следующим образом:

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 20000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 99,
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
      "type": "spend_account"
    },
    {
      "amount": 99,
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
      "type": "control_address"
    }
  ],
  "ttl": 0,
  "time_range": 0
}

Исходный код соответствующего объекта ответа выглядит следующим образом:

// BuildRequest is main struct when building transactions
type BuildRequest struct {
    Tx        *types.TxData            `json:"base_transaction"`
    Actions   []map[string]interface{} `json:"actions"`
    TTL       json.Duration            `json:"ttl"`
    TimeRange uint64                   `json:"time_range"`
}

поля структуры: - Tx TxData транзакции , зарезервированные поля , ноль - TTL время жизни (мс) построенной транзакции , это означает, что уже сохраненный в кэше utxo не может использоваться для другой транзакции сборки в течение этого периода времени ,, если левого utxo не достаточно для построения новой транзакции, или это не вызовет ошибку. Когда ttl 0, его значение по умолчанию составляет 600 с (5 минут) - TimeRange Временная метка означает, что транзакция не будет в цепочке после этой длины блока (временная метка). Чтобы избежать слишком долгого ожидания при передаче транзакции из-за задержки транспорта, транзакция истечет, если она не будет упакована в указанный TimeRange. - Actions actions структура транзакции , все транзакции состоят из действия , map тип interface{} обеспечивает масштабируемость типа действия. Действие должно содержать поля типа, чтобы различать различные типы действий. action в основном содержит input и output , его подробное введение: - input action тип : - выпускать эмиссионный актив - тратить_аккаунт тратить utxo в режиме аккаунта - тратить_акcount_unspent_output тратить указанные непосредственно utxo - output action тип : - control_address получить в адресном режиме - получение control_program в контрактном режиме (программы) - выбытие выбытие актива

Обратите внимание : - Одна транзакция должна содержать вход и выход или t Сумма активов на входе a должна быть равна выходу при построении ввода и вывода, в противном случае транзакция будет отображать сообщение об ошибке в качестве дисбаланса ввода и вывода. - Газ: актив BTM всех входов сводится к активу всех выходов - Сумма актива в сделке все в единицах neu BT 1 BTM = 1000 mBTM = 100 000 000 neu


Действие введение

action типы при построении транзакции:

вопрос

issueAction Структурный исходный код:

type issueAction struct {
    assets *Registry
    bc.AssetAmount
}

type AssetAmount struct {
    AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
    Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}

строительные поля : - assets управление активами , пользователям не нужно устанавливать параметры - AssetAmount ssetID и соответствующая сумма актива , необходимо создать AssetID с помощью create-asset , нельзя использовать идентификатор актива BTM

json формат issueAction

{
  "amount": 100000000,
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
  "type": "issue"
}

пример эмиссионного актива: (Выпуск 900000000, который assetID равен 42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f до sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me, газ составляет 20000000 neu актива BTM)

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 20000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "amount": 900000000,
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
      "type": "issue"
    },
    {
      "amount": 900000000,
      "asset_id": "42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f",
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
      "type": "control_address"
    }
  ],
  "ttl": 0,
  "time_range": 0
}
spend_account

spendAction Структурный исходный код:

type spendAction struct {
    accounts *Manager
    bc.AssetAmount
    AccountID   string  `json:"account_id"`
    ClientToken *string `json:"client_token"`
}

type AssetAmount struct {
    AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
    Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}

поля структуры: - accounts account management.users не нужно устанавливать параметры - AccountID расходов_счет - AssetAmount AssetID и соответствующая сумма актива - ClientToken Зарезервированные лимиты пользователей UTXO , null

spendAction``json формат spendAction

{
  "account_id": "0BF63M2U00A04",
  "amount": 2000000000,
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  "type": "spend_account"
}

Пример транзакции выглядит следующим образом: (Перевод 100000000 neu Бытом актив на sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me, газ 20000000 neu = вход BTM актив - выход BTM актив)

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 120000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "amount": 100000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
      "type": "control_address"
    }
  ],
  "ttl": 0,
  "time_range": 0
}
spend_account_unspent_output

spendUTXOAction Структурный исходный код:

type spendUTXOAction struct {
    accounts *Manager
    OutputID *bc.Hash `json:"output_id"`
    ClientToken *string `json:"client_token"`
}

поля структуры: - accounts account management.users не нужно устанавливать параметры - OutputID ID запроса UTXO available доступен запрос UTXO по list-unspent-outputsOutputID, соответствующему id полям API, возвращаемых результатов - ClientToken зарезервированный лимит UTXO , ноль

json формат spendUTXOAction

{
  "type": "spend_account_unspent_output",
  "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9"
}

пример транзакции осуществляемогоUTUTXO: (Перевод UTXO 100000000 neu BTM актива в sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me, газ = ввод UTXO актива BTM - вывод актива BTM)

{
  "base_transaction": null,
  "actions": [
    {
      "output_id": "58f29f0f85f7bd2a91088bcbe536dee41cd0642dfb1480d3a88589bdbfd642d9",
      "type": "spend_account_unspent_output"
    },
    {
      "amount": 100000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
      "type": "control_address"
    }
  ],
  "ttl": 0,
  "time_range": 0
}
control_address

controlAddressAction Структурный исходный код:

type controlAddressAction struct {
    bc.AssetAmount
    Address string `json:"address"`
}

type AssetAmount struct {
    AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
    Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}

Поле структуры: - Address получить адрес , можно создать адрес с помощью create-account-receiver APIинтерфейса - AssetAmount идентификатор актива для получения исоответствующая сумма актива

json формат controlAddressAction

{
  "amount": 100000000,
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  "address": "bm1q50u3z8empm5ke0g3ngl2t3sqtr6sd7cepd3z68",
  "type": "control_address"
}

Пример транзакции: (Перевод 100000000 neuBTM-адреса на sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me в режиме учетной записи, control_address введите адрес для получения)

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 120000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "amount": 100000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "address": "sm1qxe4jwhkekgnxkezu7xutu5gqnnpmyc8ppq98me",
      "type": "control_address"
    }
  ],
  "ttl": 0,
  "time_range": 0
}
control_program

controlProgramAction Структурный исходный код:

type controlProgramAction struct {
    bc.AssetAmount
    Program json.HexBytes `json:"control_program"`
}

type AssetAmount struct {
    AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
    Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}

Поля структуры: - Program сценарий контракта для получения актива , через create-account-receiver построение API-интерфейса и получение program (Результаты возврата program и address соответствуют переписке один к одному) - AssetAmount AssetID для получения и соответствующей суммы актива

json формат controlProgramAction

{
  "amount": 100000000,
  "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  "control_program":"0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
  "type": "control_program"
}

Пример транзакции: (Перевести 100000000 neu BTM-актив в program (один-в-один переписку с address0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19, control_program тип использует program для получения)

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 120000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "amount": 100000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "control_program": "0014a3f9111f3b0ee96cbd119a3ea5c60058f506fb19",
      "type": "control_program"
    }
  ],
  "ttl": 0,
  "time_range": 0
}
уходить в отставку

retireAction структурный исходный код выглядит следующим образом:

type retireAction struct {
    bc.AssetAmount
}

type AssetAmount struct {
    AssetId *AssetID `protobuf:"bytes,1,opt,name=asset_id,json=assetId" json:"asset_id,omitempty"`
    Amount  uint64   `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
}

Структура поля : - AssetAmount идентификатор актива для получения и соответствующая сумма актива

json формат retireAction

{
  "amount": 900000000,
  "asset_id": "3152a15da72be51b330e1c0f8e1c0db669269809da4f16443ff266e07cc43680",
  "type": "retire"
}

Пример транзакции: (Перевод 100000000 neu BTM выбывшего актива в режиме счета, retire выбытие указанной суммы актива)

{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ER7MEFGG0A02",
      "amount": 120000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "amount": 100000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "retire"
    }
  ],
  "ttl": 0,
  "time_range": 0
}

Реализовать конструкцию ввода build-transaction transaction вы можете отправить транзакцию по http-вызову result json result после реализации построения транзакции:

{
  "allow_additional_actions": false,
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
  "signing_instructions": [
    {
      "position": 0,
      "witness_components": [
        {
          "keys": [
            {
              "derivation_path": [
                "010100000000000000",
                "0100000000000000"
              ],
              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
            }
          ],
          "quorum": 1,
          "signatures": null,
          "type": "raw_tx_signature"
        },
        {
          "type": "data",
          "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
        }
      ]
    },
    {
      "position": 1,
      "witness_components": [
        {
          "keys": [
            {
              "derivation_path": [
                "010100000000000000",
                "0800000000000000"
              ],
              "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
            }
          ],
          "quorum": 1,
          "signatures": null,
          "type": "raw_tx_signature"
        },
        {
          "type": "data",
          "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
        }
      ]
    }
  ]
}

Исходный код соответствующего объекта ответа выглядит следующим образом:

// Template represents a partially- or fully-signed transaction.
type Template struct {
    Transaction         *types.Tx             `json:"raw_transaction"`
    SigningInstructions []*SigningInstruction `json:"signing_instructions"`

    // AllowAdditional affects whether Sign commits to the tx sighash or
    // to individual details of the tx so far. When true, signatures
    // commit to tx details, and new details may be added but existing
    // ones cannot be changed. When false, signatures commit to the tx
    // as a whole, and any change to the tx invalidates the signature.
    AllowAdditional bool `json:"allow_additional_actions"`
}

поля структуры: - Transaction об информации о транзакциях, включая TxData и bc.Tx : - TxData Представляет часть данных транзакции, отображаемую пользователю, которая видна пользователю - Version версия транзакции - SerializedSize Размер после сериализации транзакции - TimeRange максимальная временная метка (высота блока) для отправки транзакции по цепочке (если транзакция не была в цепочке, когда высота блока достигает высоты блока , транзакция будет империей) - Inputs входы транзакций - Outputs выходные данные транзакции - bc.Tx Представляет структуру преобразования, используемую для обработки транзакций в системе. Эта часть не видна пользователям, поэтому подробно не описана - SigningInstructions подпись информация о транзакции - Position до input action Место подписи - Данные от WitnessComponents до input action подписи , signatures транзакции здания null * без подписи; Если транзакция подписана успешно, в этом поле будет существовать информация о подписи. Это поле является интерфейсом, в основном включает три различных типа: - SignatureWitness хешируйте программу контракта input action в транзакции Template ,, затем подпишите для значения хеш-функции - signatures подпись транзакции (тип массива) , После выполнения sign-transaction , будет значение - keys (тип массива) Включая основной открытый ключ xpub и производный путь derivation_path, они могут найти соответствующий производный частный ключ child_xprv в период подписи, а затем использовать производный ключ для подписи. - key сумма quorum счета , длина должна быть равна keys выше 。Если quorum равна 1 , это учетная запись с единой подписью , или учетная запись с несколькими подписями - program Данные подписи value значение хеша program соответствует данным подписи。 Если program пусто, то хеш генерируется на основе текущего идентификатора транзакции и соответствующего местоположения действия InputID ,, затем используйте их как данные команды для автоматического построения program - RawTxSigWitness хэш InoutID (это поле в формате bc.Tx) input action с идентификатором транзакции Template - signatures подпись транзакции (тип массива) , После выполнения sign-transaction be будет значение - keys (arraytype), включая xpub и производный путь derivation_path ,, вы можете найти производный закрытый ключ в периоде его подписи child_xprv ,, а затем использовать производный закрытый ключ для подписи - key сумма quorum учетной записи , длина должна быть равна keys выше。Если quorum равна 1 , она представляет собой учетную запись с единой подписью , или ее учетную запись с несколькими подписями - DataWitness этот тип не требует подписи , проверить дополнительные данные программы контракта - AllowAdditional Разрешить ли торговать дополнительными данными, если для true, тогда дополнительные данные будут добавлены к транзакции, но не будут послеповлиять на выполнение транзакции program скриптом, не повлияет на результат подписи; Если для false, всю транзакцию в целом подписать, любые изменения данных будут влиять на подписи транзакции

Оценка газа

Интерфейс сметных комиссий estimate ws-transaction - gas предназначен для build -transaction сметных комиссий, результаты результатов оценки должны быть добавлены к build -transaction результатам, а затем подписаны и отправлены на сделку. Основной процесс заключается в следующем: build - estimate - build - sign - submit

估算 手续费 的 输入 请求 JSON 格式 如下:

{
  "transaction_template": {
    "allow_additional_actions": false,
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
    "signing_instructions": [
      {
        "position": 0,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0100000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": null,
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
          }
        ]
      },
      {
        "position": 1,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0800000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": null,
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
          }
        ]
      }
    ]
  }
}

Исходный код соответствующего объекта ответа выглядит следующим образом:

type request struct{
    TxTemplate txbuilder.Template `json:"transaction_template"`
}

// Template represents a partially- or fully-signed transaction.
type Template struct {
    Transaction         *types.Tx             `json:"raw_transaction"`
    SigningInstructions []*SigningInstruction `json:"signing_instructions"`

    // AllowAdditional affects whether Sign commits to the tx sighash or
    // to individual details of the tx so far. When true, signatures
    // commit to tx details, and new details may be added but existing
    // ones cannot be changed. When false, signatures commit to the tx
    // as a whole, and any change to the tx invalidates the signature.
    AllowAdditional bool `json:"allow_additional_actions"`
}

Вы можете увидеть связанные поля, включая TxTemplate в описании результата build-транзакции

Интерфейс вызова estimate ws-transaction - gas после успешного возврата json приводит к следующим результатам:

{
  "total_neu": 5000000,
  "storage_neu": 3840000,
  "vm_neu": 1419000
}

Исходный код для соответствующего объекта ответа выглядит следующим образом:

// EstimateTxGasResp estimate transaction consumed gas
type EstimateTxGasResp struct {
    TotalNeu   int64 `json:"total_neu"`
    StorageNeu int64 `json:"storage_neu"`
    VMNeu      int64 `json:"vm_neu"`
}

Поле структуры объясняется следующим образом: - TotalNeu Расчетный газ (neu) , вы можете добавить значение к активу BTM билда-транзакции, введя действие - StorageNeu Газ для хранения транзакции

- VMNeu Газ для работы на BVM

1 Ответ

0 голосов
/ 10 сентября 2018

2 、 подпись транзакции

API-интерфейс, знак-транзакция , коды api / hsm.go # L53

Запрос ввода для подписывающей транзакции в формате json ниже:

{
  "password": "123456",
  "transaction": {
    "allow_additional_actions": false,
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a077301000161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf456010003013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
    "signing_instructions": [
      {
        "position": 0,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0100000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": null,
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
          }
        ]
      },
      {
        "position": 1,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0800000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": null,
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
          }
        ]
      }
    ]
  }
}

Исходный код для соответствующего объекта запроса выглядит следующим образом ::

type SignRequest struct {    //function pseudohsmSignTemplates request
    Password string             `json:"password"`
    Txs      txbuilder.Template `json:"transaction"`
}

Поле структуры объясняется следующим образом: - Password пароль подписи , анализировать личный ключ пользователя с сервера узла по паролю , затем использовать закрытый ключ для подписи транзакции - Txs шаблон транзакции , вернуть результат сборки-транзакции type тип структуры txbuilder.Template related связанные поля вы можете увидеть в описании сборки-транзакции

sign-transaction Результат json, возвращаемый после успешного запроса, выглядит следующим образом:

{
  "sign_complete": true,
  "transaction": {
    "allow_additional_actions": false,
    "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100",
    "signing_instructions": [
      {
        "position": 0,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0100000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": [
              "273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e38806"
            ],
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd5"
          }
        ]
      },
      {
        "position": 1,
        "witness_components": [
          {
            "keys": [
              {
                "derivation_path": [
                  "010100000000000000",
                  "0800000000000000"
                ],
                "xpub": "de0db655c091b2838ccb6cddb675779b0a9a4204b122e61699b339867dd10eb0dbdc926882ff6dd75c099c181c60d63eab0033a4b0a4d0a8c78079e39d7ad1d8"
              }
            ],
            "quorum": 1,
            "signatures": [
              "0cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d"
            ],
            "type": "raw_tx_signature"
          },
          {
            "type": "data",
            "value": "05cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe61540535419"
          }
        ]
      }
    ]
  }
}

Исходный код для соответствующего объекта ответа выглядит следующим образом:

type signResp struct {
    Tx           *txbuilder.Template `json:"transaction"`
    SignComplete bool                `json:"sign_complete"`
}

Поле структуры поясняется ниже: - Шаблон транзакции txbuilder. Template после Tx подписи, если подпись успешная signatures изменится с нуля на значение подписи, а длина raw_transaction будет больше, потому что BC. Tx часть добавлена ​​для проверки параметров информация о подписи Завершить - - SignComplete отметьте, завершена ли подпись ,, если для true , подпись завершена , или это для false , для единственной подписи usual это обычно неверный пароль подписи, в то время как вам нужна другая подпись для мульти-подписи. Используйте правильный пароль подписать снова, если вы не подписали , нет необходимости build-transaction снова

3 、 Отправить транзакцию

API-интерфейс submit-транзакции , коды api / transact.go # L135

Запрос на ввод транзакции в формате json выглядит следующим образом:

{
  "raw_transaction": "070100020161015f1190c60818b4aff485c865113c802942f29ce09088cae1b117fc4c8db2292212ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8099c4d599010001160014a86c83ee12e6d790fb388345cc2e2b87056a0773630240273d5fc4fb06909fbc2968ea91c411fd20f690c88e74284ce2732052400129948538562fe432afd6cf17e590e8645b80edf80b9d9581d0a980d5f9f859e3880620d174db6506e35f2decb5be148c2984bfd0f6c67f043365bf642d1af387c04fd50161015fb018097c4040c8dd86d95611a13c24f90d4c9d9d06b25f5c9ed0556ac8abd73442275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f80a094a58d1d0101160014068840e56af74038571f223b1c99f1b60caaf4566302400cf0beefceaf9fbf1efadedeff7aee5b38ee7a25a20d78b630b01613bc2f8c9230555a6e09aaa11a82ba68c0fc9e98a47c852dfe3de851d93f9b2b7ce256f90d2005cdbcc705f07ad87521835bbba226ad7b430cc24e5e3f008edbe6154053541903013effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80bfffcb9901011600140b946646626c55a52a325c8bb48de792284d9b7200013e42275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f9d9f94a58d1d01160014c8b4391bab4923a83b955170d24ee4ca5b6ec3fb00013942275aacbeda1522cd41580f875c3c452daf5174b17ba062bf0ab71a568c123f6301160014366b275ed9b2266b645cf1b8be51009cc3b260e100"
}

Объект запроса для исходного кода показан ниже:

type SubmitRequest struct {    //function submit request
    Tx types.Tx `json:"raw_transaction"`
}

Поле структуры поясняется ниже: - Tx информация о транзакции после подписи。 raw_transaction в этом поле не является теми, кто восстановил результаты sign-transaction, это raw_transaction поле в transaction результатов восстановления подписанной транзакции

submit-transaction Результат json, возвращаемый после успешного запроса, выглядит следующим образом:

{
  "tx_id": "2c0624a7d251c29d4d1ad14297c69919214e78d995affd57e73fbf84ece361cd"
}

Объект ответа, соответствующий исходному коду, выглядит следующим образом:

type submitTxResp struct {
    TxID *bc.Hash `json:"tx_id"`
}

Поле структуры поясняется ниже: - TxID Идентификатор транзакции, который отображает информацию, когда транзакция отправляется в пул транзакций, в противном случае указывает, что транзакция не удалась

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...