54 lines
3.2 KiB
Markdown
54 lines
3.2 KiB
Markdown
## Coding: DTwitter contract
|
||
We can start updating our `/contracts/DTwitter.sol` contract code and watch as Embark watches and recompiles everything for us as we go.
|
||
### Functions
|
||
Let’s begin by writing some of our contract functions.
|
||
###### Create account
|
||
The `createAccount` function will be used for creating users in the contract. We need to add the new user to the user/address mapping so we can keep track of the address that created the user.
|
||
1. Add a user to the `users` mapping and populate details (`creationDate`, `owner`, `username`, `description`)
|
||
```
|
||
users[usernameHash].creationDate = now; // 'now' is not recommended for accuracy
|
||
users[usernameHash].owner = msg.sender;
|
||
users[usernameHash].username = username;
|
||
users[usernameHash].description = description;
|
||
```
|
||
> Note: we are using the block timestamp `now` to specify a creation date for the user (and also for the tweet time as we'll see later on). This application of `now` is fine, as ther are no reliances on this block timestamp for randomness. Please see the [Solidity documentation](https://solidity.readthedocs.io/en/v0.4.25/units-and-global-variables.html) for more information.
|
||
2. Add an entry to our `owners` mapping so we can retrieve a user by their address. This will be useful for when we need to find out if our current address is associated with a user.
|
||
```
|
||
owners[msg.sender] = usernameHash;
|
||
```
|
||
###### Edit account
|
||
We will be updating the user's profile in the `editAccount` function, so we need to be able to update the user's description and picture in the contract.
|
||
1. Update the description (could be empty):
|
||
```
|
||
users[usernameHash].description = description;
|
||
```
|
||
2. Only update the user's picture if the hash passed in is not empty or null (essentially disallows deletions):
|
||
```
|
||
if (bytes(pictureHash).length > 0) {
|
||
users[usernameHash].picture = pictureHash;
|
||
}
|
||
```
|
||
###### User exists
|
||
The `userExists` function is used for checking if a user exists in the `users` mapping stored in the contract.
|
||
1. In Solidity, we can see if an item in a `struct` exists by checking that a property of an item is not set to it's default value. For example, we can check if a specific user exists in the `users` mapping by see if the user's `creationDate` is not `0` (the default value in Solidity for the block timestamp which is a `uint`).
|
||
```
|
||
return users[usernameHash].creationDate != 0;
|
||
```
|
||
###### Tweet
|
||
For the `tweet` function to work, we need to add the tweet to the user in the `users` mapping. First, we need to get the user associated with the address who initiated the contract call (the `msg.sender`). Then, we can store the tweet in the `users` mapping against that user. Finally, we can emit an event that a tweet occurred. Later, we will subscribe to this event to get tweets as they are added to the contract in real time.
|
||
1. Get our user from the `usernameHash`
|
||
```
|
||
User storage user = users[usernameHash];
|
||
```
|
||
2. Get our new tweet index
|
||
```
|
||
uint tweetIndex = user.tweets.length++;
|
||
```
|
||
3. Update the user's tweets at the tweet index
|
||
```
|
||
user.tweets[tweetIndex] = content;
|
||
```
|
||
4. Emit the tweet event and notify the listeners
|
||
```
|
||
emit NewTweet(usernameHash, content, now);
|
||
``` |