constructor({ keychain, partyId, n, m, derivationPath, messageHash, authKey, round }) {
    $.checkArgument(keychain != null, 'keychain is required');
    $.checkArgument(partyId != null, 'partyId is required');
    $.checkArgument(n != null, 'n is required');
    $.checkArgument(m != null, 'm is required');
    $.checkArgument(messageHash != null, 'messageHash is required');
    $.checkArgument(authKey != null, 'authKey is required');

    $.checkArgument(Buffer.isBuffer(keychain.privateKeyShare), 'keychain.privateKeyShare must be a buffer');
    $.checkArgument(Buffer.isBuffer(keychain.commonKeyChain), 'keychain.commonKeyChain must be a buffer');
    this.#keychain = keychain;

    $.checkArgument(partyId >= 0 && partyId < n, 'partyId must be in the range [0, n-1]');
    this.#partyId = parseInt(partyId);

    $.checkArgument(n > 1, 'n must be at least 2');
    this.#partySize = parseInt(n);

    $.checkArgument(m > 0 && m <= this.#partySize, 'm must be in the range [1, n]');
    this.#minSigners = parseInt(m);

    $.checkArgument(derivationPath == null || (typeof derivationPath === 'string' && derivationPath.startsWith('m')), 'derivationPath must be a string starting with "m"');
    this.#derivationPath = derivationPath || 'm';

    $.checkArgument(Buffer.isBuffer(messageHash) && messageHash.length === 32, 'messageHash must be a 32 byte buffer');
    this.#messageHash = messageHash;

    $.checkArgument(round == null || (round >= 0 && round <= 5), 'round must be in the range [0, 5]');
    this.#round = parseInt(round) || 0;

    this.#authKey = new bitcoreLib.PrivateKey(authKey);
    $.checkArgument(this.#authKey.toString('hex') === authKey.toString('hex') || this.#authKey.toWIF() === authKey, 'Unrecognized authKey format');

    this.#dsg = new DklsDsg.Dsg(this.#keychain.privateKeyShare, this.#partyId, this.#derivationPath, this.#messageHash);
  }
@param {Object} params
@param {Object} params.keychain - keychain object generated by the KeyGen class
@param {Buffer} params.keychain.privateKeyShare 
@param {Buffer} params.keychain.commonKeyChain
@param {number} params.partyId - party id of the signer
@param {number} params.n - total number of participants
@param {number} params.m - number of participants required to sign
@param {string} params.derivationPath - OPTIONAL derivation path of the key to sign
@param {Buffer} params.messageHash - hash of the message to sign
@param {Buffer} params.authKey - authentication key of the signer
@param {number} params.round - round number of the signing process. This should not be explicitly given.