почему omni не поддерживает ввод p2pk в качестве отправителя в классе C - PullRequest
0 голосов
/ 26 октября 2018

https://github.com/OmniLayer/omnicore/issues/811 У меня есть вопрос в выпуске github, но никто не ответил, поэтому опубликуйте его здесь.

Я прочитал код omni core, у меня вопрос, почему транзакция класса Cвход отправителя не может быть скриптом p2pk - он поддерживает только p2pkh и p2sh.но при создании биткойна tx биткойн будет собирать транзакцию p2pk в качестве входных данных, поэтому, возможно, допустимая транзакция с недопустимым вводом типа p2pk для omni в первом vin.

имеет ли это какую-то причину или рациональный дизайн?

меня больше всего озадачивает то, что функция ExtractDestination имеет поддержку p2pk для получения адреса отправителя

        if (!IsAllowedInputType(whichType, nBlock)) {
            return -109;
        }
        CTxDestination source;
        if (ExtractDestination(txOut.scriptPubKey, source)) {
            strSender = CBitcoinAddress(source).ToString();
        }


/**
 * Checks, if the script type is allowed as input.
 */
bool IsAllowedInputType(int whichType, int nBlock)
{
    const CConsensusParams& params = ConsensusParams();

    switch (whichType)
    {
        case TX_PUBKEYHASH:
            return (params.PUBKEYHASH_BLOCK <= nBlock);

        case TX_SCRIPTHASH:
            return (params.SCRIPTHASH_BLOCK <= nBlock);
    }

    return false;
}

bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
{
    vector<valtype> vSolutions;
    txnouttype whichType;
    if (!Solver(scriptPubKey, whichType, vSolutions))
        return false;

    if (whichType == TX_PUBKEY)
    {
        CPubKey pubKey(vSolutions[0]);
        if (!pubKey.IsValid())
            return false;

        addressRet = pubKey.GetID();
        return true;
    }
    else if (whichType == TX_PUBKEYHASH)
    {
        addressRet = CKeyID(uint160(vSolutions[0]));
        return true;
    }
    else if (whichType == TX_SCRIPTHASH)
    {
        addressRet = CScriptID(uint160(vSolutions[0]));
        return true;
    }
    // Multisig txns have more than one address...
    return false;
}
...