Как я могу перевести половину вознаграждения за майнинг на адрес?

Создание децентрализованного приложения, для которого требуется половина выделенной платы за майнинг, должно осуществляться по адресу.

Мне удалось сократить майнинг, а также награду за блок:

консенсус.го

    // Accumulate the rewards for the miner and any included uncles
    reward := new(big.Int).Set(blockReward)
    rew := new(big.Int).Set(blockReward)
    r := new(big.Int)
    for _, uncle := range uncles {
        r.Add(uncle.Number, big8)
        r.Sub(r, header.Number)
        r.Mul(r, blockReward)
        r.Div(r, big8)
        state.AddBalance(uncle.Coinbase, r)

        r.Div(blockReward, big32)
        reward.Add(reward, r)
    }

    changedRew := new(big.Int).Set(rew) // half reward
    changedRew.Div(changedRew, big.NewInt(2))
    log.Warn("Mining block reward status .. ", "CHANGED", changedRew )
    state.AddBalance(header.Coinbase, changedRew)
}

state_transition.go

        if vmerr == vm.ErrInsufficientBalance {
            return nil, 0, false, vmerr
        }
    }
    st.refundGas()
    log.Warn("Half fee taken away ")
    // change price 
    st.state.AddBalance(st.evm.Coinbase, changedRew.Div(new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice), big.NewInt(2)))

    return ret, st.gasUsed(), vmerr != nil, err
}

Как мне теперь перевести вторую половину на адрес? Если я укажу учетную запись/адрес для передачи, это можно легко изменить, не влияя на правила блокировки. Как я могу сделать это безопасно?

PS: Только одна постоянная учетная запись для каждого узла для перевода половины платы за майнинг.

Ответы (1)

Так просто:

the_other_half_addr:=common.HexToAddress("0xlajfklsadjflsafjklsadjdflkadjfl")
state.AddBalance(the_other_half_addr,changedRew)

Вы делаете это надежно, но вы забыли взять половинку и у дядек.

Спасибо ! Это безопасно, потому что если адрес изменится, это приведет к другому хэшу блока. Это правда?
Да, Root() типов. Блок будет возвращать разные выходные данные, поскольку каждое изменение состояния будет изменять его хэш. Но вы должны проверить это в тесте, просто чтобы убедиться, что вы не сделали никакой ошибки. Создайте 2 разных datadirs и майните один блок с разными адресами. Хеши Root() и Hash() блока должны быть разными в обоих datadirs. Если кто-то изменит этот адрес и запустит свой собственный узел, его блок будет отброшен сетью в первом блоке с другим хешем.
Я пытался это сделать. Сохранение хранилища ключей для datadir и datadir2дало мне другой stateRootхэш. С самого начала datadirя сохранил одно и то же хранилище ключей и minerBase. Затем я повторно запустил настройку из datadir2, которая каждый раз давала мне один и тот же хэш состояния. Затем я изменил адрес аккаунта из источника, на этот stateRootраз хеш был другим. Так что он его проверяет. Но что может быть возможной причиной, по которой я не смог получить тот же корень состояния, что и datadir(исходная папка)?
Кроме того, transactions Rootони одинаковы во всех случаях. Это потому, что я добываю пустые блоки? Я думаю, что у транзакций другое дерево, чем у состояния.