Мультиподпись (Multisig) кошелёк на TON

Поймёшь модель (n, k)-multisig на TON: order, сбор подписей владельцев и отличие от обычного wallet v4/v5.

Multisig — кошелёк с порогом подписей

(n, k)-multisig хранит n публичных ключей владельцев и исполняет перевод только после сбора не менее k подписей. Один скомпрометированный ключ (при k > 1) не выводит средства. Это отдельный контракт, не «галочка» в Wallet v4.

В экосистеме TON эталон — контракты из ton-blockchain/multisig-contract / обновлённые multisig v2; ниже — модель работы и каркас order в TypeScript.


Модель: order → подписи → исполнение

typescript
// @ton/core ^0.59.0, @ton/crypto ^3.3.0
// Схема данных упрощена для понимания; layout тела сверяй с конкретной
// версией multisig (v1/v2) перед mainnet.
import { beginCell, Address, toNano } from "@ton/core";
import { sign, keyPairFromSeed } from "@ton/crypto";
import { createHash } from "crypto";

/** Хеш «заявки» на перевод — его подписывают владельцы off-chain / в order-контракте */
function orderHash(opts: {
  to: Address;
  value: bigint;
  queryId: bigint;
}): Buffer {
  const cell = beginCell()
    .storeUint(opts.queryId, 64)
    .storeAddress(opts.to)
    .storeCoins(opts.value)
    .endCell();
  return createHash("sha256").update(cell.hash()).digest();
}

// Демо: два владельца, порог k=2 (оба должны подписать)
const owner0 = keyPairFromSeed(createHash("sha256").update("owner0-demo").digest());
const owner1 = keyPairFromSeed(createHash("sha256").update("owner1-demo").digest());

const hash = orderHash({
  to: Address.parse("EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N"),
  value: toNano("1"),
  queryId: 1n,
});

const sig0 = sign(hash, owner0.secretKey);
const sig1 = sign(hash, owner1.secretKey);

console.log("signatures", sig0.length, sig1.length); // 64 + 64
// Дальше: упаковать order + подписи в сообщение к multisig-контракту
// (см. create-order / add-signature в официальном howto или JS SDK multisig).

На практике часто используют готовые скрипты Fift/@ton-community helpers: создать order → каждый owner добавляет подпись → один из них шлёт собранный order на адрес multisig.

ПараметрСмысл
nЧисло владельцев (публичных ключей в storage)
kМинимальное число подписей для исполнения
orderЗаявка: куда, сколько, TTL на сбор подписей

Как это работает

  • Обычный wallet принимает одну подпись secretKey владельца.
  • Multisig принимает order с набором подписей; контракт проверяет, что подписанты ∈ списка owners и |sigs| ≥ k.
  • Адрес multisig = хеш его StateInit (код + список ключей + параметры) — смена набора owners без миграции = другой адрес.
  • Пока подписей меньше k, on-chain состояние средств не меняется (или order ждёт в отдельном контракте — зависит от версии).

Частые ошибки

Деплой «multisig» с k=1 и n=1 «для удобства» → это обычный single-sig с лишней сложностью; для одного ключа бери Wallet v4/v5.

Потерял k ключей из n (например 2-of-3 и утрачены два seed) → средства недоступны. Храни доли у разных людей/устройств и проверь процедуру recovery до перевода капитала.

Смешал ключи owners с ключом «отправителя газа» → газ на доставку order может платить любой; право голоса дают только ключи из списка owners.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация