8000 Develop by Garlicnezha · Pull Request #199 · XDagger/xdagj · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Develop #199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ Four stages:
- Time Synchronization Method with NTP

[XDAGJ_Time_Synchronization](./docs/XDAGJ_Time_Synchronization_en.md)]
- XDAGJ RPC Document

[XDAGJ_RPC](./docs/XDAGJ_RPC.md)

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/io/xdag/cli/Commands.java
Original file line number Diff line number Diff line change
Expand Up @@ -769,7 +769,9 @@ public String xferToNew() {
kernel.getBlockStore().fetchOurBlocks(pair -> {
int index = pair.getKey();
Block block = pair.getValue();

if (XdagTime.getCurrentEpoch() < XdagTime.getEpoch(block.getTimestamp()) + 2 * CONFIRMATIONS_COUNT) {
return false;
}
if (compareAmountTo(UInt64.ZERO, block.getInfo().getAmount()) < 0) {
// if (remain.get() <= block.getInfo().getAmount()) {
ourBlocks.put(new Address(block.getHashLow(), XDAG_FIELD_IN, block.getInfo().getAmount(), false),
Expand Down
39 changes: 20 additions & 19 deletions src/main/java/io/xdag/core/BlockchainImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -800,7 +800,6 @@ private UInt64 applyBlock(Block block) {
sumOut = sumOut.add(link.getAmount());
}
}

if (compareAmountTo(block.getInfo().getAmount().add(sumIn),sumOut) < 0 ||
compareAmountTo(block.getInfo().getAmount().add(sumIn),sumIn) < 0
) {
Expand All @@ -823,7 +822,7 @@ private UInt64 applyBlock(Block block) {
}else {
if(link.getType() == XDAG_FIELD_INPUT){
subtractAmount(BasicUtils.Hash2byte(link.addressHash), link.getAmount(), block);
}else {
}else if(link.getType() == XDAG_FIELD_OUTPUT){
addAmount(BasicUtils.Hash2byte(link.addressHash), link.getAmount(), block);
}
}
Expand Down Expand Up @@ -891,21 +890,16 @@ public void setMain(Block block) {
// 设置奖励
long mainNumber = xdagStats.nmain + 1;
log.debug("mainNumber = {},hash = {}", mainNumber, Hex.toHexString(block.getInfo().getHash()));
long reward = getReward(mainNumber);
block.getInfo().setHeight(mainNumber);
updateBlockFlag(block, BI_MAIN, true);

long awardEpoch = kernel.getConfig().getPoolSpec().getAwardEpoch();
long rewardHeight = mainNumber > awardEpoch + snapshotHeight ? mainNumber - awardEpoch : -1;
log.debug("rewardHeight: {}", rewardHeight);
long reward = getReward(rewardHeight);
// 接收奖励
if (rewardHeight > snapshotHeight) {
reward(UInt64.valueOf(reward), rewardHeight);
}
acceptAmount(block, UInt64.valueOf(reward));
xdagStats.nmain++;

// 递归执行主块引用的区块 并获取手续费
addAndAccept(block, applyBlock(block));
acceptAmount(block, applyBlock(block));
// 主块REF指向自身
// TODO:补充手续费
updateBlockRef(block, new Address(block));
Expand All @@ -927,19 +921,14 @@ public void unSetMain(Block block) {

log.debug("UnSet main,{}, mainnumber = {}", block.getHash().toHexString(), xdagStats.nmain);

long amount = getReward(xdagStats.nmain);
updateBlockFlag(block, BI_MAIN, false);
long awardEpoch = kernel.getConfig().getPoolSpec().getAwardEpoch();
long withdrawHeight = xdagStats.nmain > awardEpoch + snapshotHeight ? xdagStats.nmain - awardEpoch : -1;
long amount = getReward(withdrawHeight);
if (withdrawHeight > snapshotHeight) {
Block withdrawBlock = blockStore.getBlockByHash(getBlockByHeight(withdrawHeight).getHashLow(), true);
// Withdraw the reward
cancelReward(withdrawBlock, UInt64.valueOf(amount));
}

xdagStats.nmain--;

addAndAccept(block, unApplyBlock(block));
// 去掉奖励和引用块的手续费
acceptAmount(block, UInt64.ZERO.subtract(amount));
acceptAmount(block, unApplyBlock(block));

if (randomXUtils != null) {
randomXUtils.randomXUnsetForkTime(block);
Expand Down Expand Up @@ -1629,6 +1618,18 @@ private void addAmount(byte[] addressHash, UInt64 amount, Block block){
}
}

8000
// TODO : accept amount to block which in snapshot
private void acceptAmount(Block block, UInt64 amount) {
block.getInfo().setAmount(block.getInfo().getAmount().add(amount));
if (block.isSaved) {
blockStore.saveBlockInfo(block.getInfo());
}
if ((block.getInfo().flags & BI_OURS) != 0) {
xdagStats.setBalance(amount.add(xdagStats.getBalance()));
// xdagStats.setBalance(amount.plus(long2UnsignedLong(xdagStats.getBalance())).longValue());
}
}

private void reward(UInt64 amount, long height){
Block rewardBlock = blockStore.getBlockByHash(getBlockByHeight(height).getHashLow(),true);
Address coinbase = rewardBlock.getCoinBase();
Expand Down
27 changes: 8 additions & 19 deletions src/main/java/io/xdag/mine/manager/AwardManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@
package io.xdag.mine.manager;

import static io.xdag.config.Constants.*;
import static io.xdag.core.XdagField.FieldType.XDAG_FIELD_INPUT;
import static io.xdag.core.XdagField.FieldType.XDAG_FIELD_OUTPUT;
import static io.xdag.core.XdagField.FieldType.*;
import static io.xdag.utils.BasicUtils.*;
import static io.xdag.utils.BytesUtils.compareTo;
import static java.lang.Math.E;
Expand Down Expand Up @@ -68,6 +67,7 @@
import org.apache.tuweni.bytes.Bytes32;
import org.apache.tuweni.bytes.MutableBytes32;
import org.apache.tuweni.units.bigints.UInt64;
import org.checkerframework.checker.units.qual.A;
import org.hyperledger.besu.crypto.KeyPair;


Expand Down Expand Up @@ -352,12 +352,6 @@ public int payMiners(long time) {
// Bytes32.wrap(BytesUtils.fixBytes(hash, 8, 24));
hashlow.set(8, Bytes.wrap(hash).slice(8, 24));
Block block = blockchain.getBlockByHash(hashlow, true);
int flag = block.getInfo().flags & ~(BI_OURS | BI_REMARK);
// 1F
if (flag != (BI_REF | BI_MAIN_REF | BI_APPLIED | BI_MAIN | BI_MAIN_CHAIN)) {
log.debug("Block:{} not become a mainBlock,didn't reward",block.getHash().toHexString());
return -1;
}
//TODO
log.debug("Hash low [{}]",hashlow.toHexString());
if (keyPos < 0) {
Expand All @@ -377,15 +371,8 @@ public int payMiners(long time) {
return -3;
}

if(!checkMine(block)){
log.debug("Isn't mine");
return -4;
}

payData.balance = UInt64.valueOf(blockchain.getReward(block.getInfo().getHeight()));
if(amount2xdag(payData.balance) == 1024){
log.debug("error reward block height:{} && hash:{}",block.getInfo().getHeight(),block.getHash());
}
payData.balance = block.getInfo().getAmount();


if (compareAmountTo(payData.balance,UInt64.ZERO) <= 0) {
Expand Down Expand Up @@ -588,6 +575,9 @@ public void doPayments(Bytes32 hashLow, int paymentsPerBlock, PayData payData, i
* += payData.poolFee;
*/

receipt.add(new Address(blockchain.getBlockByHash(hashLow,true).getCoinBase().getAddress(),XDAG_FIELD_OUTPUT,payData.poolFee,true));
payAmount = payAmount.add(payData.poolFee);

if (fundRation!=0) {
if (pubAddress2Hash(fundAddress)!=null) {
payAmount = payAmount.add(payData.fundIncome);
Expand Down Expand Up @@ -640,13 +630,12 @@ && compareTo(payData.rewardMiner, 8, 24, miner.getAddressHash().toArray(), 8, 24
public void transaction(Bytes32 hashLow, ArrayList<Address> receipt, UInt64 payAmount, int keypos) {
log.debug("All Payment: {}", payAmount);
log.debug("unlock keypos =[{}]", keypos);
MutableBytes32 coinBase = blockchain.getBlockByHash(hashLow,true).getCoinBase().getAddress();
for (Address address : receipt) {
log.debug("pay data: {}", address.getData().toHexString());
}
Map<Address, KeyPair> inputMap = new HashMap<>();
Address input = new Address(coinBase, XDAG_FIELD_INPUT, payAmount,true);
KeyPair inputKey = wallet.getAccount(BasicUtils.Hash2byte(coinBase));
Address input = new Address(hashLow, XDAG_FIELD_IN, payAmount,false);
KeyPair inputKey = wallet.getAccount(keypos);
inputMap.put(input, inputKey);
Block block = blockchain.createNewBlock(inputMap, receipt, false, null);
if (inputKey.equals(wallet.getDefKey())) {
Expand Down
33 changes: 15 additions & 18 deletions src/test/java/io/xdag/core/BlockchainTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,17 +152,15 @@ public void tearDown() throws IOException {
public void testExtraBlock() {
// Date date = fastDateFormat.parse("2020-09-20 23:45:00");
long generateTime = 1600616700000L;
KeyPair poolKey = KeyPair.create(secretkey_1, Sign.CURVE, Sign.CURVE_NAME);
KeyPair key = KeyPair.create(secretkey_1, Sign.CURVE, Sign.CURVE_NAME);
MockBlockchain blockchain = new MockBlockchain(kernel);
blockchain.getAddressStore().updateBalance(Keys.toBytesAddress(poolKey), xdag2amount(0));
XdagTopStatus stats = blockchain.getXdagTopStatus();
assertNotNull(stats);
List<Address> pending = Lists.newArrayList();

ImportResult result;
log.debug("1. create 1 tx block");
Block addressBlock = generateAddressBlock(config, poolKey, generateTime);

Block addressBlock = generateAddressBlock(config, key, generateTime);

// 1. add address block
result = blockchain.tryToConnect(addressBlock);
Expand All @@ -172,28 +170,30 @@ public void testExtraBlock() {
List<Block> extraBlockList = Lists.newLinkedList();
Bytes32 ref = addressBlock.getHashLow();
// 2. create 100 mainblocks
for (int i = 1; i <= 27; i++) {
for (int i = 1; i <= 10; i++) {
log.debug("create No." + i + " extra block");
generateTime += 64000L;
pending.clear();
pending.add(new Address(ref, XDAG_FIELD_OUT,false));
pending.add(new Address(keyPair2Hash(poolKey),
XdagField.FieldType.XDAG_FIELD_COINBASE,
true));
long time = XdagTime.msToXdagtimestamp(generateTime);
long xdagTime = XdagTime.getEndOfEpoch(time);
Block extraBlock = generateExtraBlock(config, poolKey, xdagTime, pending);
Block extraBlock = generateExtraBlock(config, key, xdagTime, pending);
result = blockchain.tryToConnect(extraBlock);
assertSame(result, IMPORTED_BEST);
assertChainStatus(i + 1, i - 1, 1, i < 2 ? 1 : 0, blockchain);
assertChainStatus(i + 1, i > 1 ? i - 1 : 0, 1, i < 2 ? 1 : 0, blockchain);
assertArrayEquals(extraBlock.getHashLow().toArray(), stats.getTop());
Block storedExtraBlock = blockchain.getBlockByHash(Bytes32.wrap(stats.getTop()), false);
assertArrayEquals(extraBlock.getHashLow().toArray(), storedExtraBlock.getHashLow().t D705 oArray());
ref = extraBlock.getHashLow();
extraBlockList.add(extraBlock);
}

UInt64 poolBalance = blockchain.getAddressStore().getBalanceByAddress(Keys.toBytesAddress(poolKey));
assertEquals(10240,(long)amount2xdag(poolBalance));
// skip first 2 extra block amount assert
Lists.reverse(extraBlockList).stream().skip(2).forEach(b -> {
Block sb = blockchain.getBlockByHash(b.getHashLow(), false);
// System.out.println(Hex.toHexString(sb.getHashLow()) + ": " + String.valueOf(amount2xdag(sb.getInfo().getAmount())));
assertEquals("1024.0", String.valueOf(amount2xdag(sb.getInfo().getAmount())));
});
}

@Test
Expand All @@ -206,7 +206,7 @@ public void testNew2NewTransactionBlock() {
Block addressBlock = generateAddressBlock(config, addrKey, generateTime);
// System.out.println(PubkeyAddressUtils.toBase58(Keys.toBytesAddress(addrKey)));
MockBlockchain blockchain = new MockBlockchain(kernel);
blockchain.getAddressStore().updateBalance(Keys.toBytesAddress(poolKey), xdag2amount(0));
blockchain.getAddressStore().updateBalance(Keys.toBytesAddress(poolKey), xdag2amount(1000));
ImportResult result = blockchain.tryToConnect(addressBlock);
// import address block, result must be IMPORTED_BEST
assertSame(result, IMPORTED_BEST);
Expand Down Expand Up @@ -272,12 +272,9 @@ public void testNew2NewTransactionBlock() {
pending.clear();
}

Block toBlock = blockchain.getBlockStore().getBlockInfoByHash(to.getAddress());
Block fromBlock = blockchain.getBlockStore().getBlockInfoByHash(from.getAddress());
UInt64 poolBalance = blockchain.getAddressStore().getBalanceByAddress(Keys.toBytesAddress(poolKey));
UInt64 addressBalance = kernel.getAddressStore().getBalanceByAddress(Keys.toBytesAddress(addrKey));
assertEquals(10240,(long)amount2xdag(blockchain.getAddressStore().getAllBalance()));
assertEquals(10140,(long)amount2xdag(poolBalance.toLong()));
assertEquals(900,(long)amount2xdag(poolBalance.toLong()));
assertEquals(100,(long)amount2xdag(addressBalance.toLong()));
}

Expand Down Expand Up @@ -358,7 +355,7 @@ public void testOld2NewTransaction(){

UInt64 poolBalance = UInt64.valueOf((long)amount2xdag(blockchain.getBlockByHash(addressBlock.getHash(),false).getInfo().getAmount()));
UInt64 addressBalance = kernel.getAddressStore().getBalanceByAddress(Keys.toBytesAddress(addrKey));
assertEquals(900,poolBalance.toLong());
assertEquals(1924 ,poolBalance.toLong());
assertEquals(100,(long)amount2xdag(addressBalance.toLong()));
}

Expand Down
0