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;
}