Я пытаюсь написать контракт, в котором составитель контракта предложит вознаграждение, которое может быть получено только по другому адресу, который он или она укажет. Для этого я пытаюсь создать переменную состояния типа «адрес», в которой хранится адрес человека, которому разрешено претендовать на награду, которого я называю «посол».
См. код ниже:
pragma solidity ^0.4.19;
contract AmbassadorTask {
address private owner; // Address of business offering rewards for a task
uint taskReward; // How much ether ambassadors get every time they complete a task
address ambassador; // Represents person allowed to complete task and claim rewards
//Constructor
function AmbassadorTask (address _ambassador) public payable {
require (msg.value > 0); // No point creating tasks with no rewards
owner = msg.sender; // Set creator to be the owner of this contract
taskReward = msg.value;
ambassador = _ambassador;
}
function getAmbassador() public view returns (address _ambassador) {
return ambassador;
}
}
Код корректно компилируется в Remix, но когда я тестирую его во время выполнения с помощью JavaScriptVM, адрес «посла», хранящийся в контракте, не совпадает с адресом, который я передаю в качестве входных данных в конструкторе.
Например, я передаю 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c в качестве входных данных при вызове конструктора. Если я немедленно вызову getAmbassador(), я получу следующий вывод: 0xa4aff308fddc160c0000000000000000000000000 вместо значения, которое я ввел для создания контракта. Я также заметил, что это всего лишь последние 16 шестнадцатеричных цифр адреса, которые я передал, за которыми следуют конечные нули.
Напротив, у меня нет такой же проблемы с сохранением msg.sender в переменной состояния владельца при вызове конструктора.
Почему это происходит? Я неправильно храню значения адреса? Это проблема преобразования данных?
Заранее спасибо за вашу помощь!
Убедитесь, что вы заключаете адрес в кавычки, когда указываете его в качестве параметра конструктора. Remix очень плохо справляется с разбором шестнадцатеричных строк без кавычек.
Я мог воспроизвести поведение, которое вы видели, только с помощью шестнадцатеричной строки без кавычек. С кавычками он работал правильно все 10 раз, когда я пытался это сделать.
Рамон