The white paper goes on to explain that such a model is insufficient and that additional features are needed:
In the case of the final implementation of Bitcoin, a "coin" could be thought of as an unspent transaction output.
That would be a value which is encumbered with a requirement that must be met before that value can be spent. There is a scripting language which is used to place the encumbrance on the value. The most common script used (version 1 addresses) is a script that requires the spender to supply BOTH a valid public key which hashes to a value supplied in the script AND a signature which can be validated using the supplied public key.
when we do transaction, I pass my wallet address only to previous owner. how the previous owner know my public key?
He does not.
His wallet software uses the "address" to do 4 things to "send the bitcoins to you" in the transaction:
- Extracts a hash value, version number, and checksum from the address
- Uses the checksum to make sure that the address was entered correctly (this allows the wallet software to prevent sending to a mis-typted address)
- Uses the address version to identify which encumbering script to build
- Builds the encumbering script in the transaction with the extracted hash value
When you ask someone to send you some bitcoins, their wallet software choose some unspent transaction outputs for which they can satisfy the encumbrance requirements. They assemble these as a list of inputs to the transaction to supply value to the transaction. Then they use the Bitcoin Scripting language to meet the requirements of each input. They then create an output with the value that you requested, and encumbered with the version 1 script using the hash from the address that you supplied. As such, nobody can spend that output unless they can satisfy the encumbrance requirements. The version 1 script requires BOTH a public key that hashes to the same value as stored in the script AND a signature that can be validated with THAT public key.
Since you provided the address, you know the public key and you have the private key.
When you want to spend that "coin", your wallet software lists it in the inputs to your transaction to supply your transaction with value. Your software then meets the encumbrance requirements by supplying the appropriate script using BOTH the public key that hashes to the value from the output you are spending AND the digital signature that can be validated with THAT public key. Your software then creates an output with the value that you are paying which is encumbered with a script that is built based on the rules of the address version that was supplied to you when the payment was requested from you.