Солидность: отправьте строковый массив, пару значений ключа или объект в качестве параметра функции - PullRequest
0 голосов
/ 18 ноября 2018

Чтобы изменить состояние смарт-контракта от входных данных внешнего интерфейса, требуется передать массив строк в смарт-контракт, пару значений ключа или объекты.

Можно ли использовать строковый массив в качестве параметра?

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Как видно из приведенного ниже примера из документа солидности, мы можем отправить байтовый массив в конструктор

constructor(bytes32[] memory proposalNames) public {
    chairperson = msg.sender;
    voters[chairperson].weight = 1;

    // For each of the provided proposal names,
    // create a new proposal object and add it
    // to the end of the array.
    for (uint i = 0; i < proposalNames.length; i++) {
        // `Proposal({...})` creates a temporary
        // Proposal object and `proposals.push(...)`
        // appends it to the end of `proposals`.
        proposals.push(Proposal({
            name: proposalNames[i],
            voteCount: 0
        }));
    }
}

Если вы пытаетесь отправить данные строки / объекта конкретно, то лучше отделить методы и вызвать каждый методотдельно или внутри друг друга, так как в настоящее время солидность не поддерживает это (использование ABIencodere v2 является исключительным, поскольку рекомендуется только для целей разработки - согласно дате написания этого ответа)

struct A{
uint date,
B[] b
}

Вы можете отделить этона

struct A{
uint date
}
struct B{
string goods,
uint quantity
}

, так что теперь за 1 А вы можете позвонить в NB из вашего сервиса.Используйте сопоставление для связывания обоих (если зависит).

В текущей ситуации лучше разработать контракт, который не принимает объемные входные данные или не выдает объемные выходные данные.Однако контракты предназначены не для хранения огромных данных, а для хранения связанных данных, которые соответствуют соглашению сторон

0 голосов
/ 18 ноября 2018

Никакая солидность не поддерживает массивы строк в качестве параметра. Вы должны были бы сериализовать и десериализовать его в виде строки самостоятельно, чтобы получить желаемый результат, но это было бы дорого для надежности. Вы можете проверить это на ремиксе, если хотите. Однако при ремиксе в сообщении об ошибке говорится, что эта функция поддерживается в experimental ABI encoder, но я никогда не проверял это или то, насколько хорошо он работает с другими библиотеками, и в конце концов он экспериментален.

...