*bool GetContractData(const void* const scriptID,void* const pkey,short len,void* const pValue,short maxlen) * 中间层传了两个个参数 * 1.脚本的id号 * 2.数据库的key值 */
| 1638 | * 2.数据库的key值 |
| 1639 | */ |
| 1640 | int32_t ExGetContractDataFunc(lua_State *L) { |
| 1641 | vector<std::shared_ptr<vector<uint8_t>>> retdata; |
| 1642 | |
| 1643 | if (!GetDataTableGetContractData(L, retdata) || retdata.size() != 2 || retdata.at(0).get()->size() != 6) |
| 1644 | return RetFalse("ExGetContractDataFunc tep1 err1"); |
| 1645 | |
| 1646 | CLuaVMRunEnv *pVmRunEnv = GetVmRunEnv(L); |
| 1647 | if (nullptr == pVmRunEnv) |
| 1648 | return RetFalse("pVmRunEnv is nullptr"); |
| 1649 | |
| 1650 | CContractDBCache *scriptDB = pVmRunEnv->GetScriptDB(); |
| 1651 | CRegID contractRegId(*retdata.at(0)); |
| 1652 | string key((*retdata.at(1)).begin(), (*retdata.at(1)).end()); |
| 1653 | string value; |
| 1654 | |
| 1655 | int32_t len = 0; |
| 1656 | if (contractRegId.IsEmpty() || !scriptDB->GetContractData(contractRegId, key, value)) { |
| 1657 | len = 0; |
| 1658 | lua_BurnStoreUnchanged(L, key.size(), 0, BURN_VER_R2); |
| 1659 | } else { |
| 1660 | lua_BurnStoreGet(L, key.size(), value.size(), BURN_VER_R2); |
| 1661 | len = RetRstToLua(L, vector<uint8_t>(value.begin(), value.end())); |
| 1662 | } |
| 1663 | #ifdef TRACE_LUAVM_CONTRACT_DATA |
| 1664 | LogPrint(BCLog::LUAVM, "GetContractData(), contract_regid=%s, key=%s, key_hex=%s, value=%s, value_hex=%s\n", |
| 1665 | contractRegId.ToString(), key, HexStr(key), value, HexStr(value)); |
| 1666 | #endif//TRACE_LUAVM_CONTRACT_DATA |
| 1667 | /* |
| 1668 | * 每个函数里的Lua栈是私有的,当把返回值压入Lua栈以后,该栈会自动被清空*/ |
| 1669 | return len; |
| 1670 | } |
| 1671 | |
| 1672 | /** |
| 1673 | * 取目的账户ID |
nothing calls this directly
no test coverage detected