This has been a work in progress for a few weeks as my sMerit supply slowly dwindles, but
this thread has somewhat forced my hand a bit, as you will see if you read my reasoning below. So here goes:
If you want to be a merit source:
1. Be a somewhat established member.
2. Collect TEN posts written in the last couple of months by other people that have not received nearly enough merit for how good they are, and post quotes for them all in a new Meta thread. The point of this is to demonstrate your ability to give out merit usefully.
I like to think I'd be classed as "somewhat established", I'm on both the list of
top merit receivers and
top merit senders, and I'm way above average in terms of reporting, which I would hope would qualify me enough to apply. I'm sure people will let me know if I'm way off base here.
There are lots and lots of excellent posts, in particular technical explanations and guides, which certainly deserve more merit than they have received, but they have at least received
some merit. However, I figure if all I did as a merit source was reinforce other sources' decisions with more merit, then I'm not really helping to keep the system as decentralized as possible. With that in mind, I've chosen instead to focus entirely on posts that have
received no merit at all (this statement is correct at time of posting, although I now plan to merit these users). Also, in the spirit of spreading merit around as much as possible, and ensuring deserving newer members are not hindered from ranking up, I've also decided to focus entirely on posts made by
users with less than 50 merits.
While the posts I've selected below are generally not of the very high standard you would see in other "Merit Source Application" threads, I believe these posts show junior members who are here for the right reasons - to ask questions, learn, discuss, and contribute, regardless of whether you agree with their opinions, and not just to spam. These are the members we should be encouraging to stay by rewarding their efforts. I've also made a conscious effort to pick users who, at no point in their posting history, have contributed to spam via bounty hunting or bounty reports. @theymos - if I'm going completely the wrong direction here, please let me know and I will reapply with 10 exceptional posts as is the standard. I simply figured with a constant stream of people applying in this way (and no offense to them), to take things in a new direction.
As an aside, this has been a good personal confirmation of my
long held suspicion: There are very few good posts from junior members which go unmerited. As I mentioned, I've been working on this list for a few weeks or so, and every time I come back to it I have to remove one or two of the posts from it because someone has merited it already. I'm keen to see how LoyceV's thread turns out.
Post 1Block Checking & Submit Blocks
File - main.cpp
Line - 1154 -1295
bool CBlock::CheckBlock() const
{
These are checks that are independent of context
that can be verified before saving an orphan block.
// This section checks the Size limits
if (vtx.empty() || vtx.size() > MAX_SIZE || ::GetSerializeSize(*this, SER_DISK) > MAX_SIZE)
return error("CheckBlock() : size limits failed");
// This section of code if for checking the timestamp of the block, a timestamp is valid if it is greater than the median timestamp of last 11 blocks and less than the network-adjusted time + 2 hours
if (nTime > GetAdjustedTime() + 2 * 60 * 60)
return error("CheckBlock() : block timestamp too far in the future");
// This section checks to make sure the first transaction is a coinbase transaction and everything else is not a coinbase TX
if (vtx.empty() || !vtx[0].IsCoinBase())
return error("CheckBlock() : first tx is not coinbase");
for (int i = 1; i < vtx.size(); i++)
if (vtx[i].IsCoinBase())
return error("CheckBlock() : more than one coinbase");
// Check transactions
foreach(const CTransaction& tx, vtx)
if (!tx.CheckTransaction())
return error("CheckBlock() : CheckTransaction failed");
// This section checks that the proof of work matches claimed amount
if (CBigNum().SetCompact(nBits) > bnProofOfWorkLimit)
return error("CheckBlock() : nBits below minimum work");
if (GetHash() > CBigNum().SetCompact(nBits).getuint256())
return error("CheckBlock() : hash doesn't match nBits");
// It is then passed to check the merkleroot
if (hashMerkleRoot != BuildMerkleTree())
return error("CheckBlock() : hashMerkleRoot mismatch");
return true;
}
Now the code will check for AcceptBlock by checking the following aspects.
bool CBlock::AcceptBlock()
// In this section the code performs a check for duplicate block.
uint256 hash = GetHash();
if (mapBlockIndex.count(hash))
return error("AcceptBlock() : block already in mapBlockIndex");
// Here the code will get the previous block index
map::iterator mi = mapBlockIndex.find(hashPrevBlock);
if (mi == mapBlockIndex.end())
return error("AcceptBlock() : prev block not found");
CBlockIndex* pindexPrev = (*mi).second;
// It will then check the timestamp against previous block
if (nTime <= pindexPrev->GetMedianTimePast())
return error("AcceptBlock() : block's timestamp is too early");
// It then performs a check on the proof of work
if (nBits != GetNextWorkRequired(pindexPrev))
return error("AcceptBlock() : incorrect proof of work");
// Here the code will write the block to history file
if (!CheckDiskSpace(::GetSerializeSize(*this, SER_DISK)))
return error("AcceptBlock() : out of disk space");
unsigned int nFile;
unsigned int nBlockPos;
if (!WriteToDisk(!fClient, nFile, nBlockPos))
return error("AcceptBlock() : WriteToDisk failed");
if (!AddToBlockIndex(nFile, nBlockPos))
return error("AcceptBlock() : AddToBlockIndex failed");
if (hashBestChain == hash)
RelayInventory(CInv(MSG_BLOCK, hash));
The next section is commented out of the code and I am still looking for some references for the code below and relations to VAtoms.
// // Add atoms to user reviews for coins created
// vector vchPubKey;
// if (ExtractPubKey(vtx[0].vout[0].scriptPubKey, false, vchPubKey))
// {
// unsigned short nAtom = GetRand(USHRT_MAX - 100) + 100;
// vector vAtoms(1, nAtom);
// AddAtomsAndPropagate(Hash(vchPubKey.begin(), vchPubKey.end()), vAtoms, true);
// }
return true;
}
Next the code looks to process the block by the following.
bool ProcessBlock(CNode* pfrom, CBlock* pblock)
// Check for duplicate
uint256 hash = pblock->GetHash();
if (mapBlockIndex.count(hash))
return error("ProcessBlock() : already have block %d %s", mapBlockIndex[hash]->nHeight, hash.ToString().substr(0,14).c_str());
if (mapOrphanBlocks.count(hash))
return error("ProcessBlock() : already have block (orphan) %s", hash.ToString().substr(0,14).c_str());
// Preliminary checks
if (!pblock->CheckBlock())
{
delete pblock;
return error("ProcessBlock() : CheckBlock FAILED");
}
// If don't already have its previous block, shunt it off to holding area until we get it
if (!mapBlockIndex.count(pblock->hashPrevBlock))
{
printf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString().substr(0,14).c_str());
mapOrphanBlocks.insert(make_pair(hash, pblock));
mapOrphanBlocksByPrev.insert(make_pair(pblock->hashPrevBlock, pblock));
// Ask this guy to fill in what we're missing
if (pfrom)
pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), GetOrphanRoot(pblock));
return true;
}
// Store to disk
if (!pblock->AcceptBlock())
{
delete pblock;
return error("ProcessBlock() : AcceptBlock FAILED");
}
delete pblock;
// Recursively process any orphan blocks that depended on this one
vector vWorkQueue;
vWorkQueue.push_back(hash);
for (int i = 0; i < vWorkQueue.size(); i++)
{
uint256 hashPrev = vWorkQueue[i];
for (multimap::iterator mi = mapOrphanBlocksByPrev.lower_bound(hashPrev);
mi != mapOrphanBlocksByPrev.upper_bound(hashPrev);
++mi)
{
CBlock* pblockOrphan = (*mi).second;
if (pblockOrphan->AcceptBlock())
vWorkQueue.push_back(pblockOrphan->GetHash());
mapOrphanBlocks.erase(pblockOrphan->GetHash());
delete pblockOrphan;
}
mapOrphanBlocksByPrev.erase(hashPrev);
}
At this point the miner would be very happy! as the block has passed the checked and can be called Valid.
The code then prints below :
printf("ProcessBlock: ACCEPTED\n");
return true;
Post 2I understand what your trying to say . yes both of them are different though people still thinks that bank and bitcoin are the same because bitcoin can be store of value and it can be used as an invesment simillar to what they hear on the traditional banks but for me , both are actually different because bitcoin is commonly known as a curency while banks are a company that produces money .
Banks are not supposed to "produce" money, but the sad truth is that they do, out of thin air! The way modern banks work is pretty similar to a ponzi scheme, its called
Fractional Reserve Banking something that would be illegal (and it was until the 20th century) but the banks bought their way thru legislation and its perfectly ok to play roulette with the savings of people...
But people are seriously misled into thinking banks store money (they don't), or that their fiat money is backed into something (its not).
The scheme will hold as long as a sum above the fractional reserve is now withdraw at the same time (see?, just like any other scheme).
So if the bank keeps 10% of the money, that's its limit before going bankrupt. But before that happens, Central Banks to the rescue. Now that 10% would need to be nationwide withdraw, to bankrupt the central bank, but World Bank to the rescue! now in the world 10% needs to be withdraw to bankrupt the entire system... (actually the fraction is different on every country).
If only more people knew about fractional reserve banking... Debt based economies (school of chicago) would crash. Stop trusting banks!
Post 3I have developed this idea into a BIP which is available for people to view here.
https://github.com/mechanikalk/bips/blob/master/bip-%3F%3F%3F%3F.mediawikiWould really appreciate any additional feedback or discussion.
The TL;DR is that it is many Bitcoin blockchains that are merge mined at different difficulties with different sets of state. This prevents sharding of PoW without causing sharding of state. Would enable a Bitcoin like blockchain to scale to 10,000s of TPS without any centralization.
Thanks!
Post 4Hey guys,
I’ve been involved with bitcoin since 2011, long time user but never much for posting on forums or anything.
I recently have been putting together information to write a paper and I’m doing some market research. I often read forums and have helped others in the past in person when it comes to explaining bitcoin and assisting interested persons in learning about all crypto. I notice a lot of repeating questions and issues with new users and i just want to get a broader look on the community's problems see how that match up with my current perspective, and see what can be done to help newbies/ prospective users.
So, some questions I have for new users of bitcoin/crypto, or even more advanced users that still have issues.
1. What do you find is your biggest issues/ struggles when it comes to learning about cryptocurrency?
2. What would you say is your biggest pain points about crypto in general?
3. ^^ What is so difficult about these things and why?
4. What have you tried to solve these issues? Did anything work? What didn’t work?
5. If you could ask one question about cryptocurrency that you would want an answer to what would it be?
6. What interested you in cryptocurrency to try to learn about it in the first place? What are your main interests in in the space now?
7. What are your motives for, or what do you want to achieve, being involved in cryptocurrency? (What you hope to gain)
8. If there was something that could solve your issues regarding crypto, what do you think it would it be?
Feel free to answer any of these questions you feel like, or all of them if you choose, if you don’t want your answers publicized or you feel its too long to post, I’m more then happy to take them in email, just let me know and i can shoot you my email.
Also, for anyone potentially interested i’d also like to further interview anyone with pain points revolving bitcoin, maybe I could even help some users with answers to their issues as I have been involved with crypto for many years. I’m just interested in hearing what peoples issues most commonly in this space and what possible things can solve the community and its prospective members issues. If you’re interested in am email interview with just some further questions please feel free to email me or also message me here we can set something up, who knows maybe I can even offer some insight on your issues. Thanks guys!
Post 5Bitcoin ETF, as I understand is a way of indirectly buying bitcoin without needing to go through all the processes associated with purchase (exchanges, wallets, private keys etc)
It's basically a share of bitcoin which can be tradeable in external exchanges and would be classified as a security and would mirror the value of actual bitcoin.
It has been presented as a door to bring institutional investors into bitcoin and increase the adoption and price.
But I've come across articles where institutional investors are said to be buying bitcoin through OTC trades.
My question is;
Why would investors wait to buy bitcoin indirectly, when they can buy now?
And is the grounds of possible manipulations on which the proposals has been rejected a solid argument?
And lastly would bitcoin ETF approval herald the bull run as most people believe?
Post 6Satoshi will certainly be the anomaly here, though. I'm sure other more active users and even some of the most prolific would have difficulty having their older posts merited to such an extent. Most will be long buried and forgotten, whereas satoshi's will always have a spotlight on them. Even theymos doesn't post that much compared to the rest of the community but he is the most merited user here according to the merit stats and that's probably because he gets a lot for stickies and announcements of rules changes and so forth -- or people just like to suck up to him lol.
I don't feel very comfortable with this..yes, Satoshi is a recognized figure here and otherwise. His posts are historic and has some form of direction and inspiration but continual meriting such posts doesn't seem very ideal to me. Reflecting on the past is good not continual compensation rather that should be used to focus on the present. This doesn't mean value in satoshi's post or works will reduce neither will meriting it increase its value anymore than it is.
You could write a thesis on bitcoin and it might not be merited for all sorts of reasons.
This is one of the reasons spamming/plagiarism/repetition is still a major issue the forum has to always combat. In as much as we all don't want to entirely admit it, we humans, always want recognition almost immediately at all point if possible. Yes, there are lazy users that has no interests in contributing positive but only after what the he/she can take from the system yet, there are still that few that don't mind contributing as long as the will get the recognition.
Now and then, I see posts of existing users on parma-ban for mostly plagiarism and I wonder if these long term users never read the rules or the chose to ignore and why... Some part of me feels this may be the reason coupled with other factors like the individual just being lazy. I know we can't go all a sore of meriting all quality posts and all that but we can always make efforts noticed even through our comments. I know alot of new users appreciates when hero/lengendary users comment and share ideas relating to the new user's quality post. It gives feelings that almost competes with the feeling that comes with a merit.
Post 7(Python)
> p=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
>
> x=0x78D430274F8C5EC1321338151E9F27F4C676A008BDF8638D07C0B6BE9AB35C71
>
> x3=pow(x,3,p) --> x^3 = x^3 mod p
>
> y2=(x3+7) % p --> y^2 = x^3 + 7 mod p
>
> y=pow(y2,(p+1)/4,p) --> this line computes sqrt(y^2) = y
>
> hex(y)
'0x5eae7f9cdbc532b201694991c0d137fec371f8d32f64c7cb5e607e08a633c7da'
>
because this y is even, we compute -y = p-y (if y is even, p-y is always odd and viceversa)
>
> hex(p-y)
>'0xa1518063243acd4dfe96b66e3f2ec8013c8e072cd09b3834a19f81f659cc3455'
then:
A1518063243ACD4DFE96B66E3F2EC8013C8E072CD09B3834A19F81F659CC3455 : y (odd)
uncompressed key = '04' + 'x' + 'y'
0478D430274F8C5EC1321338151E9F27F4C676A008BDF8638D07C0B6BE9AB35C71A1518063243ACD4DFE96B66E3F2EC8013C8E072CD09B3834A19F81F659CC3455
Wow, thank you for posting this. I was driving myself insane trying to understand more of the math and how it's actually implemented, trying very small values from links like this one:
https://www.coindesk.com/math-behind-bitcointo get a feel for it. I think I'm getting there. I hope that ordering and reading Mastering Bitcoin: Programming the Open Blockchain will help with the math, and trying to write my own blockchain parser.
I'm not a math heavyweight, so I have a couple of questions if you have time:
From what I understand so far, there are constants that are always the same in Bitcoin. This includes the Q (curve generator), the p (for mod p), taken from your code and which I noted in the link to coindesk. I couldn't see how the order was calculated, given other values. Can you briefly describe what a base point is? I think I'm getting a decent idea of what a finite field is.
When trying to find:
y=pow(y2,(p+1)/4,p) --> this line computes sqrt(y^2) = y
Is this always how it's done, for any y2, p is always the same, and the (p+1)/4 part is constant as well for getting y from y2?
Thanks again!
Post 8Does anyone have the exact numbers of how much protection you get using a 24 word seed vs using the conventional default standard that shows up automatically when you create a wallet in Electrum?
It's still not clear to me that you can trust this type of wallet, that could be bruteforced and then all of your keys are compromised forever as long as you keep creating them on that wallet. It still seems safer to use a wallet.dat file. I want to see the math.
Here's the basics. Using the 2048 word BIP39 list, each word represents 11 bits of entropy (2**11 = 2048). So a 12 word phrase has 132 bits of entropy, and therefore a 24 word phrase has 264 bits of entropy.
Looking at a 12 word phrase, that means there are 2**132 possible combinations = 5.444 x 10**39 possibilities.
A 24 word phrase has 2**256 possibililties, or 1.158 x 10**77
If you want to go the distance on this analysis, you can do the math as to how long either would take, assuming some # of guesses/second.
Either should give you comfort.
If you want to consider phrases other than 12 or 24 words, as long as you're using the BIP39 list just remember: #bits of entropy = #words * 11
and number of possible phrases = 2**(#bits of entropy)
Post 9Hey everyone,
I've been looking into 51 percent attacks recently and was wondering about the limitations. In a 51 percent attack an attacker tries to generate an alternate chain faster than the honest chain. To convince the network that his chain is the correct, he must ultimately have the longest chain.
The blocktime for each chain is 10 min per block. If blocks are created too fast, the difficulty is adjusted.
Given these limitations how is it possible to build an alternate chain that grows much faster than the honest chain? If my understanding is correct, nodes also check whether the difficulty target has been adjusted correctly. So if the block time is too short in the long run, the newly mined blocks might not been recognized by the network.
Is that correct or do I miss something? Thanks!
Post 10
That's not what it means. It means the python interpreter he has does not think the code is correct. That's because he's using an older version of python as NeuroticFish pointed out above. He needs to update to python 3.6 or stick with electrum 3.2.3.
This is how I built Python 3.7.2 from source on Debian Stretch
The steps:
1. Update all system packages first
sudo apt-get update && sudo apt-get upgrade
2. Install the required build tools for Python 3.7.2
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev
sudo apt-get install -y libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm
sudo apt-get install -y libncurses5-dev libncursesw5-dev xz-utils tk-dev
3. Download the latest version 3.7.2 source file and its SIG file using wget
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz.asc
4. Verify the authenticity of the source file
gpg -v Python-3.7.2.tgz.asc
5. Unpack the source file
6. Enter the Python-3.7.2 directory and run ‘./configure’ to prepare the build
cd Python-3.7.2
./configure --enable-optimizations
7. Run the following command to build Python 3.7.2
8. Run the following command to install Python 3.7.2
9. Reboot the machine
After installing Python 3.7.2, below are the steps that I took to run Electrum 3.3.2:
9. Go to the folder where the downloaded file Electrum-3.3.2.tar.gz is
10. Unpack the gzipped file
11. Go to the directory where run_electrum is located
12. Type python3.7 run_electrum in a terminal
13. The following error appears:
Error: Could not import PyQt5 on Linux systems, you may try 'sudo apt-get install python3-pyqt5'
/usr/local/lib/python3.7/asyncio/events.py:88: RuntimeWarning: coroutine 'ignore_exceptions..wrapper' was never awaited
self._context.run(self._callback, *self._args)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
14. I went back to Step 8 and instead of
altinstall, I typed the command:
and rebooted the machine. This time Python3.7 is the default on my Debian Stretch
15. I typed the command python3.7 run_electrum and the same error message appeared:
Error: Could not import PyQt5 on Linux systems, you may try 'sudo apt-get install python3-pyqt5'
/usr/local/lib/python3.7/asyncio/events.py:88: RuntimeWarning: coroutine 'ignore_exceptions..wrapper' was never awaited
self._context.run(self._callback, *self._args)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
Please note that python3-pyqt5 has already been installed when I was using version 3.2.3
Thomas (developer): If you are reading this post, could you help me out please?
By the way, season's greetings to all of the folks here.