Optimize account copies and use RefCell to handle duplicate accounts in BPF programs (#7958)

This commit is contained in:
Jack May
2020-01-24 10:54:26 -08:00
committed by GitHub
parent d400a64b9a
commit 34ed93d57c
12 changed files with 339 additions and 169 deletions

View File

@ -226,31 +226,42 @@ SOL_FN_PREFIX bool sol_deserialize(
return false;
}
params->ka_num = *(uint64_t *) input;
if (ka_num < *(uint64_t *) input) {
input += sizeof(uint64_t);
if (ka_num < params->ka_num) {
return false;
}
input += sizeof(uint64_t);
for (int i = 0; i < params->ka_num; i++) {
// key
params->ka[i].is_signer = *(uint64_t *) input != 0;
input += sizeof(uint64_t);
params->ka[i].key = (SolPubkey *) input;
input += sizeof(SolPubkey);
uint8_t dup_info = input[0];
input += sizeof(uint8_t);
if (dup_info == 0) {
// key
params->ka[i].is_signer = *(uint64_t *) input != 0;
input += sizeof(uint64_t);
params->ka[i].key = (SolPubkey *) input;
input += sizeof(SolPubkey);
// lamports
params->ka[i].lamports = (uint64_t *) input;
input += sizeof(uint64_t);
// lamports
params->ka[i].lamports = (uint64_t *) input;
input += sizeof(uint64_t);
// account userdata
params->ka[i].userdata_len = *(uint64_t *) input;
input += sizeof(uint64_t);
params->ka[i].userdata = (uint8_t *) input;
input += params->ka[i].userdata_len;
// account userdata
params->ka[i].userdata_len = *(uint64_t *) input;
input += sizeof(uint64_t);
params->ka[i].userdata = (uint8_t *) input;
input += params->ka[i].userdata_len;
// owner
params->ka[i].owner = (SolPubkey *) input;
input += sizeof(SolPubkey);
// owner
params->ka[i].owner = (SolPubkey *) input;
input += sizeof(SolPubkey);
} else {
params->ka[i].is_signer = params->ka[dup_info].is_signer;
params->ka[i].key = params->ka[dup_info].key;
params->ka[i].lamports = params->ka[dup_info].lamports;
params->ka[i].userdata_len = params->ka[dup_info].userdata_len;
params->ka[i].userdata = params->ka[dup_info].userdata;
params->ka[i].owner = params->ka[dup_info].owner;
}
}
params->data_len = *(uint64_t *) input;